diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
index c2db6b0..6d3b22d 100644
--- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
@@ -40,14 +40,6 @@ class EntityViewBuilder implements EntityControllerInterface, EntityViewBuilderI
   protected $entityManager;
 
   /**
-   * An array of view mode info for the type of entities for which this
-   * controller is instantiated.
-   *
-   * @var array
-   */
-  protected $viewModesInfo;
-
-  /**
    * The cache bin used to store the render cache.
    *
    * @todo Defaults to 'cache' for now, until http://drupal.org/node/1194136 is
@@ -71,7 +63,6 @@ public function __construct($entity_type, array $entity_info, EntityManager $ent
     $this->entityType = $entity_type;
     $this->entityInfo = $entity_info;
     $this->entityManager = $entity_manager;
-    $this->viewModesInfo = entity_get_view_modes($entity_type);
   }
 
   /**
@@ -137,10 +128,8 @@ protected function getBuildDefaults(EntityInterface $entity, $view_mode, $langco
     );
 
     // Cache the rendered output if permitted by the view mode and global entity
-    // type configuration. The isset() checks below are necessary because
-    // 'default' is not an actual view mode.
-    $view_mode_is_cacheable = !isset($this->viewModesInfo[$view_mode]) || (isset($this->viewModesInfo[$view_mode]) && $this->viewModesInfo[$view_mode]['cache']);
-    if ($view_mode_is_cacheable && !$entity->isNew() && !isset($entity->in_preview) && $this->entityInfo['render_cache']) {
+    // type configuration.
+    if ($this->isViewModeCacheable($view_mode) && !$entity->isNew() && !isset($entity->in_preview) && $this->entityInfo['render_cache']) {
       $return['#cache'] = array(
         'keys' => array('entity_view', $this->entityType, $entity->id(), $view_mode),
         'granularity' => DRUPAL_CACHE_PER_ROLE,
@@ -266,4 +255,23 @@ public function resetCache(array $entities = NULL) {
       \Drupal::cache($this->cacheBin)->deleteTags(array($this->entityType . '_view' => TRUE));
     }
   }
+
+  /**
+   * Returns TRUE if the view mode is cacheable.
+   *
+   * @param string $view_mode
+   *   Name of the view mode that should be rendered.
+   *
+   * @return bool
+   *   TRUE if the view mode can be cached, FALSE otherwise.
+   */
+  protected function isViewModeCacheable($view_mode) {
+    if ($view_mode == 'default') {
+      // The 'default' is not an actual view mode.
+      return TRUE;
+    }
+    $view_modes_info = entity_get_view_modes($this->entityType);
+    return !empty($view_modes_info[$view_mode]['cache']);
+  }
+
 }
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentNonNodeTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentNonNodeTest.php
index bda6e04..e2b4597 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentNonNodeTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentNonNodeTest.php
@@ -305,9 +305,6 @@ function testCommentFunctionality() {
       'view test entity' => TRUE,
       'skip comment approval' => FALSE,
     ));
-    // We've changed role permissions, so need to reset render cache.
-    // @todo Revisit after https://drupal.org/node/2099105
-    \Drupal::entityManager()->getViewBuilder('entity_test')->resetCache(array($this->entity));
     $this->drupalGet('entity_test/' . $this->entity->id());
     $this->assertPattern('@<h2[^>]*>Comments</h2>@', 'Comments were displayed.');
     $this->assertLink('Log in', 0, 'Link to log in was found.');
@@ -324,9 +321,6 @@ function testCommentFunctionality() {
       'skip comment approval' => TRUE,
       'view test entity' => TRUE,
     ));
-    // We've changed role permissions, so need to reset render cache.
-    // @todo Revisit after https://drupal.org/node/2099105
-    \Drupal::entityManager()->getViewBuilder('entity_test')->resetCache(array($this->entity));
     $this->drupalGet('entity_test/' . $this->entity->id());
     $this->assertNoPattern('@<h2[^>]*>Comments</h2>@', 'Comments were not displayed.');
     $this->assertFieldByName('subject', '', 'Subject field found.');
diff --git a/core/modules/entity/lib/Drupal/entity/Form/EntityDisplayModeFormBase.php b/core/modules/entity/lib/Drupal/entity/Form/EntityDisplayModeFormBase.php
index dc96922..39dff2d 100644
--- a/core/modules/entity/lib/Drupal/entity/Form/EntityDisplayModeFormBase.php
+++ b/core/modules/entity/lib/Drupal/entity/Form/EntityDisplayModeFormBase.php
@@ -109,6 +109,10 @@ public function form(array $form, array &$form_state) {
    *   TRUE if the display mode exists, FALSE otherwise.
    */
   public function exists($entity_id, array $element, array $form_state) {
+    // Do not allow to add internal 'default' view mode.
+    if ($entity_id == 'default') {
+      return TRUE;
+    }
     return (bool) $this->queryFactory
       ->get($this->entity->entityType())
       ->condition('id', $element['#field_prefix'] . $entity_id)
diff --git a/core/modules/filter/lib/Drupal/filter/Tests/FilterDefaultConfigTest.php b/core/modules/filter/lib/Drupal/filter/Tests/FilterDefaultConfigTest.php
index ef25d64..5210663 100644
--- a/core/modules/filter/lib/Drupal/filter/Tests/FilterDefaultConfigTest.php
+++ b/core/modules/filter/lib/Drupal/filter/Tests/FilterDefaultConfigTest.php
@@ -14,7 +14,7 @@
  */
 class FilterDefaultConfigTest extends DrupalUnitTestBase {
 
-  public static $modules = array('system', 'user', 'filter', 'filter_test');
+  public static $modules = array('system', 'user', 'filter', 'filter_test', 'entity');
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/rdf/lib/Drupal/rdf/Entity/RdfMapping.php b/core/modules/rdf/lib/Drupal/rdf/Entity/RdfMapping.php
index cdb70c5..10cfcff 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Entity/RdfMapping.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Entity/RdfMapping.php
@@ -169,7 +169,7 @@ public function getExportProperties() {
   public function postSave(EntityStorageControllerInterface $storage_controller, $update = TRUE) {
     parent::postSave($storage_controller, $update);
 
-    if (\Drupal::entityManager()->hasController($this->targetEntityType, 'render')) {
+    if (!$this->isSyncing() && \Drupal::entityManager()->hasController($this->targetEntityType, 'view_builder')) {
       \Drupal::entityManager()->getViewBuilder($this->targetEntityType)->resetCache();
     }
   }
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php b/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php
index 66cc333..1a20404 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php
@@ -19,7 +19,7 @@ class DrupalUnitTestBaseTest extends DrupalUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('entity_test');
+  public static $modules = array('entity', 'entity_test');
 
   public static function getInfo() {
     return array(
@@ -33,14 +33,14 @@ public static function getInfo() {
    * Tests expected behavior of setUp().
    */
   function testSetUp() {
-    $module = 'entity_test';
+    $modules = array('entity', 'entity_test');
     $table = 'entity_test';
 
     // Verify that specified $modules have been loaded.
-    $this->assertTrue(function_exists('entity_test_permission'), "$module.module was loaded.");
+    $this->assertTrue(function_exists('entity_test_permission'), 'entity_test.module was loaded.');
     // Verify that there is a fixed module list.
-    $this->assertIdentical(array_keys(\Drupal::moduleHandler()->getModuleList()), array($module));
-    $this->assertIdentical(\Drupal::moduleHandler()->getImplementations('permission'), array($module));
+    $this->assertIdentical(array_keys(\Drupal::moduleHandler()->getModuleList()), $modules);
+    $this->assertIdentical(\Drupal::moduleHandler()->getImplementations('permission'), $modules);
 
     // Verify that no modules have been installed.
     $this->assertFalse(db_table_exists($table), "'$table' database table not found.");
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityViewControllerTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityViewControllerTest.php
index d08d45a..2c6a159 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityViewControllerTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityViewControllerTest.php
@@ -101,7 +101,6 @@ public function testFieldItemAttributes() {
     ))->save();
     // Browse to the entity and verify that the attributes from both modules
     // are rendered in the field item HTML markup.
-    \Drupal::entityManager()->getViewBuilder('entity_test')->resetCache(array($entity));
     $this->drupalGet('entity_test/' . $entity->id());
     $xpath = $this->xpath('//div[@data-field-item-attr="foobar" and @property="schema:text" and text()=:value]', array(':value' => $test_value));
     $this->assertTrue($xpath, 'The field item attributes from both modules have been found in the rendered output of the field.');
diff --git a/core/modules/user/lib/Drupal/user/Entity/Role.php b/core/modules/user/lib/Drupal/user/Entity/Role.php
index 2fd26ac..f1d43f1 100644
--- a/core/modules/user/lib/Drupal/user/Entity/Role.php
+++ b/core/modules/user/lib/Drupal/user/Entity/Role.php
@@ -140,7 +140,11 @@ public function preSave(EntityStorageControllerInterface $storage_controller) {
   public function postSave(EntityStorageControllerInterface $storage_controller, $update = TRUE) {
     parent::postSave($storage_controller, $update);
 
-    Cache::invalidateTags(array('role' => $this->id()));
+    if (!$this->isSyncing()) {
+      Cache::invalidateTags(array('role' => $this->id()));
+      // Clear render cache.
+      entity_render_cache_clear();
+    }
   }
 
   /**
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserEntityTest.php b/core/modules/user/lib/Drupal/user/Tests/UserEntityTest.php
index 8532008..00fbe34 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserEntityTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserEntityTest.php
@@ -23,7 +23,7 @@ class UserEntityTest extends DrupalUnitTestBase {
    *
    * @var array
    */
-  public static $modules = array('system', 'user', 'field');
+  public static $modules = array('system', 'user', 'field', 'entity');
 
   public static function getInfo() {
     return array(
