diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 12b1d80..55435fb 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -37,11 +37,6 @@ const DRUPAL_MINIMUM_PHP_MEMORY_LIMIT = '32M';
 const CACHE_PERMANENT = 0;
 
 /**
- * Indicates that the item should be removed at the next general cache wipe.
- */
-const CACHE_TEMPORARY = -1;
-
-/**
  * @defgroup logging_severity_levels Logging severity levels
  * @{
  * Logging severity levels as defined in RFC 3164.
diff --git a/core/includes/cache.inc b/core/includes/cache.inc
index 603a4d1..6da66b5 100644
--- a/core/includes/cache.inc
+++ b/core/includes/cache.inc
@@ -69,17 +69,8 @@ function cache_get_backends() {
 }
 
 /**
- * Expires data from the block and page caches.
+ * Clear the page and block caches.
  */
-function cache_clear_all() {
-  // @todo: remove before release.
-  if (func_get_args()) {
-    throw new Exception(t('cache_clear_all() no longer takes arguments, use cache() instead.'));
-  }
-  // Clear the block cache first, so stale data will
-  // not end up in the page cache.
-  if (module_exists('block')) {
-    cache('block')->expire();
-  }
-  cache('page')->expire();
+function cache_clear_content() {
+  return cache_invalidate(array('content' => array(TRUE)));
 }
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 5ff6167..04c0d57 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -108,7 +108,7 @@ const HTTP_REQUEST_TIMEOUT = -1;
  * specified. Use DRUPAL_CACHE_CUSTOM to disable standard block cache and
  * implement
  *
- * The block cache is cleared in cache_clear_all(), and uses the same clearing
+ * The block cache is cleared in cache_clear_content(), and uses the same clearing
  * policy than page cache (node, comment, user, taxonomy added or updated...).
  * Blocks requiring more fine-grained clearing might consider disabling the
  * built-in block cache (DRUPAL_NO_CACHE) and roll their own.
@@ -5255,7 +5255,7 @@ function drupal_page_set_cache() {
         'title' => drupal_get_title(),
         'headers' => array(),
       ),
-      'expire' => CACHE_TEMPORARY,
+      'tags' => array('content' => TRUE),
       'created' => REQUEST_TIME,
     );
 
@@ -6245,7 +6245,7 @@ function drupal_render_collect_attached($elements, $return = FALSE) {
  *   - #pre_render: $function with a _pre_render suffix.
  *   - #cache: An associative array prepared for drupal_render_cache_set().
  */
-function drupal_render_cache_by_query($query, $function, $expire = CACHE_TEMPORARY, $granularity = NULL) {
+function drupal_render_cache_by_query($query, $function, $expire = CACHE_PERMANENT, $granularity = NULL) {
   $cache_keys = array_merge(array($function), drupal_render_cid_parts($granularity));
   $query->preExecute();
   $cache_keys[] = hash('sha256', serialize(array((string) $query, $query->getArguments())));
diff --git a/core/includes/menu.inc b/core/includes/menu.inc
index fecd158..0ceffd6 100644
--- a/core/includes/menu.inc
+++ b/core/includes/menu.inc
@@ -2623,7 +2623,7 @@ function menu_cache_clear($menu_name = 'navigation') {
  * Clears all cached menu data. This should be called any time broad changes
  * might have been made to the router items or menu links.
  */
-function menu_cache_clear_all() {
+function menu_cache_clear_content() {
   cache('menu')->flush();
   menu_reset_static_cache();
 }
@@ -2667,7 +2667,7 @@ function menu_rebuild() {
     _menu_router_save($menu, $masks);
     _menu_navigation_links_rebuild($menu);
     // Clear the menu, page and block caches.
-    menu_cache_clear_all();
+    menu_cache_clear_content();
     _menu_clear_page_cache();
     // Indicate that the menu has been successfully rebuilt.
     variable_del('menu_rebuild_needed');
@@ -2982,7 +2982,7 @@ function _menu_delete_item($item, $force = FALSE) {
  * Saves a menu link.
  *
  * After calling this function, rebuild the menu cache using
- * menu_cache_clear_all().
+ * menu_cache_clear_content().
  *
  * @param $item
  *   An associative array representing a menu link item, with elements:
@@ -3250,13 +3250,13 @@ function _menu_clear_page_cache() {
   // Clear the page and block caches, but at most twice, including at
   //  the end of the page load when there are multiple links saved or deleted.
   if ($cache_cleared == 0) {
-    cache_clear_all();
+    cache_clear_content();
     // Keep track of which menus have expanded items.
     _menu_set_expanded_menus();
     $cache_cleared = 1;
   }
   elseif ($cache_cleared == 1) {
-    drupal_register_shutdown_function('cache_clear_all');
+    drupal_register_shutdown_function('cache_clear_content');
     // Keep track of which menus have expanded items.
     drupal_register_shutdown_function('_menu_set_expanded_menus');
     $cache_cleared = 2;
diff --git a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
index e22c3ba..e78f3ae 100644
--- a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
+++ b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
@@ -94,11 +94,9 @@ interface CacheBackendInterface {
    * @param $expire
    *   One of the following values:
    *   - CACHE_PERMANENT: Indicates that the item should never be removed unless
-   *     explicitly told to using cache_clear_all() with a cache ID.
-   *   - CACHE_TEMPORARY: Indicates that the item should be removed at the next
-   *     general cache wipe.
+   *     explicitly told to using cache->delete($cid).
    *   - A Unix timestamp: Indicates that the item should be kept at least until
-   *     the given time, after which it behaves like CACHE_TEMPORARY.
+   *     the given time.
    * @param array $tags
    *   An array of tags to be stored with the cache item. These should normally
    *   identify objects used to build the cache item, which should trigger
diff --git a/core/modules/aggregator/aggregator.parser.inc b/core/modules/aggregator/aggregator.parser.inc
index 0f594d4..2d4100f 100644
--- a/core/modules/aggregator/aggregator.parser.inc
+++ b/core/modules/aggregator/aggregator.parser.inc
@@ -44,8 +44,8 @@ function aggregator_aggregator_parse($feed) {
     $feed->etag = $etag;
     $feed->modified = $modified;
 
-    // Clear the cache.
-    cache_clear_all();
+    // Clear the page and block caches.
+    cache_clear_content();
 
     return TRUE;
   }
diff --git a/core/modules/block/block.admin.inc b/core/modules/block/block.admin.inc
index 8a5553d..7e4e2b7 100644
--- a/core/modules/block/block.admin.inc
+++ b/core/modules/block/block.admin.inc
@@ -205,7 +205,7 @@ function block_admin_display_form_submit($form, &$form_state) {
     throw $e;
   }
   drupal_set_message(t('The block settings have been updated.'));
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
@@ -525,7 +525,7 @@ function block_admin_configure_submit($form, &$form_state) {
       throw $e;
     }
     drupal_set_message(t('The block configuration has been saved.'));
-    cache_clear_all();
+    cache_clear_content();
     $form_state['redirect'] = 'admin/structure/block';
   }
 }
@@ -617,7 +617,7 @@ function block_add_block_form_submit($form, &$form_state) {
   }
 
   drupal_set_message(t('The block has been created.'));
-  cache_clear_all();
+  cache_clear_content();
   $form_state['redirect'] = 'admin/structure/block';
 }
 
@@ -660,7 +660,7 @@ function block_custom_block_delete_submit($form, &$form_state) {
     ->condition('delta', $form_state['values']['bid'])
     ->execute();
   drupal_set_message(t('The block %name has been removed.', array('%name' => $form_state['values']['info'])));
-  cache_clear_all();
+  cache_clear_content();
   $form_state['redirect'] = 'admin/structure/block';
   return;
 }
@@ -712,4 +712,3 @@ function template_preprocess_block_admin_display_form(&$variables) {
 
   $variables['form_submit'] = drupal_render_children($variables['form']);
 }
-
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 25bd3b1..9b6d78a 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -374,7 +374,7 @@ function _block_get_renderable_region($list = array()) {
           'keys' => array($block->module, $block->delta),
           'granularity' => $block->cache,
           'bin' => 'block',
-          'expire' => CACHE_TEMPORARY,
+          'tags' => array('content' => TRUE),
         ),
       );
     }
diff --git a/core/modules/block/block.test b/core/modules/block/block.test
index 4af6240..2e8a9d5 100644
--- a/core/modules/block/block.test
+++ b/core/modules/block/block.test
@@ -571,7 +571,7 @@ class BlockCacheTestCase extends DrupalWebTestCase {
     $this->assertText($old_content, t('Block is served from the cache.'));
 
     // Clear the cache and verify that the stale data is no longer there.
-    cache_clear_all();
+    cache_clear_content();
     $this->drupalGet('');
     $this->assertNoText($old_content, t('Block cache clear removes stale cache data.'));
     $this->assertText($current_content, t('Fresh block content is displayed after clearing the cache.'));
diff --git a/core/modules/book/book.install b/core/modules/book/book.install
index 899ee81..44a198b 100644
--- a/core/modules/book/book.install
+++ b/core/modules/book/book.install
@@ -25,7 +25,7 @@ function book_uninstall() {
   db_delete('menu_links')
     ->condition('module', 'book')
     ->execute();
-  menu_cache_clear_all();
+  menu_cache_clear_content();
 }
 
 /**
diff --git a/core/modules/comment/comment.admin.inc b/core/modules/comment/comment.admin.inc
index d84b785..75752c9 100644
--- a/core/modules/comment/comment.admin.inc
+++ b/core/modules/comment/comment.admin.inc
@@ -189,7 +189,7 @@ function comment_admin_overview_submit($form, &$form_state) {
   }
   drupal_set_message(t('The update has been performed.'));
   $form_state['redirect'] = 'admin/content/comment';
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
@@ -237,7 +237,7 @@ function comment_multiple_delete_confirm($form, &$form_state) {
 function comment_multiple_delete_confirm_submit($form, &$form_state) {
   if ($form_state['values']['confirm']) {
     comment_delete_multiple(array_keys($form_state['values']['comments']));
-    cache_clear_all();
+    cache_clear_content();
     $count = count($form_state['values']['comments']);
     watchdog('content', 'Deleted @count comments.', array('@count' => $count));
     drupal_set_message(format_plural($count, 'Deleted 1 comment.', 'Deleted @count comments.'));
@@ -296,7 +296,7 @@ function comment_confirm_delete_submit($form, &$form_state) {
   drupal_set_message(t('The comment and all its replies have been deleted.'));
   watchdog('content', 'Deleted comment @cid and its replies.', array('@cid' => $comment->cid));
   // Clear the cache so an anonymous user sees that his comment was deleted.
-  cache_clear_all();
+  cache_clear_content();
 
   $form_state['redirect'] = "node/$comment->nid";
 }
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index a714419..0d4570f 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -2101,7 +2101,7 @@ function comment_form_submit($form, &$form_state) {
   $form_state['redirect'] = $redirect;
   // Clear the block and page caches so that anonymous users see the comment
   // they have posted.
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
@@ -2444,7 +2444,7 @@ function comment_unpublish_by_keyword_action_submit($form, $form_state) {
  */
 function comment_save_action(Comment $comment) {
   comment_save($comment);
-  cache_clear_all();
+  cache_clear_content();
   watchdog('action', 'Saved comment %title', array('%title' => $comment->subject));
 }
 
diff --git a/core/modules/comment/comment.test b/core/modules/comment/comment.test
index 259e420..2ec69f7 100644
--- a/core/modules/comment/comment.test
+++ b/core/modules/comment/comment.test
@@ -1730,7 +1730,7 @@ class CommentBlockFunctionalTest extends CommentHelperCase {
     user_role_revoke_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
     // drupalCreateNode() does not automatically flush content caches unlike
     // posting a node from a node form.
-    cache_clear_all();
+    cache_clear_content();
     $this->drupalGet('');
     $this->assertNoText($block['title'], t('Block was not found.'));
     user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
diff --git a/core/modules/forum/forum.admin.inc b/core/modules/forum/forum.admin.inc
index 5fd396f..4f10d5b 100644
--- a/core/modules/forum/forum.admin.inc
+++ b/core/modules/forum/forum.admin.inc
@@ -96,7 +96,7 @@ function forum_form_submit($form, &$form_state) {
     case SAVED_UPDATED:
       drupal_set_message(t('The @type %term has been updated.', array('%term' => $form_state['values']['name'], '@type' => $type)));
       // Clear the page and block caches to avoid stale data.
-      cache_clear_all();
+      cache_clear_content();
       break;
   }
   $form_state['redirect'] = 'admin/structure/forum';
diff --git a/core/modules/locale/locale.test b/core/modules/locale/locale.test
index bb3c6e7..c64d288 100644
--- a/core/modules/locale/locale.test
+++ b/core/modules/locale/locale.test
@@ -380,7 +380,7 @@ class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
     // Test JavaScript translation rebuilding.
     file_unmanaged_delete($js_file);
     $this->assertTrue($result = !file_exists($js_file), t('JavaScript file deleted: %file', array('%file' => $result ? $js_file : t('found'))));
-    cache_clear_all();
+    cache_clear_content();
     _locale_rebuild_js($langcode);
     $this->assertTrue($result = file_exists($js_file), t('JavaScript file rebuilt: %file', array('%file' => $result ? $js_file : t('not found'))));
   }
diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module
index 1f8bd3a..105e933 100644
--- a/core/modules/menu/menu.module
+++ b/core/modules/menu/menu.module
@@ -198,7 +198,7 @@ function menu_enable() {
       menu_link_save($link);
     }
   }
-  menu_cache_clear_all();
+  menu_cache_clear_content();
 }
 
 /**
@@ -264,7 +264,7 @@ function menu_save($menu) {
       'description' => $menu['description'],
     ))
     ->execute();
-  menu_cache_clear_all();
+  menu_cache_clear_content();
 
   switch ($status) {
     case SAVED_NEW:
@@ -328,7 +328,7 @@ function menu_delete($menu) {
     ->condition('menu_name', $menu['menu_name'])
     ->execute();
 
-  menu_cache_clear_all();
+  menu_cache_clear_content();
   module_invoke_all('menu_delete', $menu);
 }
 
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index ac18da7..b89fe10 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -609,7 +609,7 @@ function node_admin_nodes_submit($form, &$form_state) {
     }
     call_user_func_array($function, $args);
 
-    cache_clear_all();
+    cache_clear_content();
   }
   else {
     // We need to rebuild the form to go to a second step. For example, to
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index a59a5c7..efeaeb2 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -3651,7 +3651,7 @@ function node_access_rebuild($batch_mode = FALSE) {
   if (!isset($batch)) {
     drupal_set_message(t('Content permissions have been rebuilt.'));
     node_access_needs_rebuild(FALSE);
-    cache_clear_all();
+    cache_clear_content();
   }
 }
 
@@ -3701,7 +3701,7 @@ function _node_access_rebuild_batch_finished($success, $results, $operations) {
   else {
     drupal_set_message(t('The content access permissions have not been properly rebuilt.'), 'error');
   }
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index 4e94b26..e7f7326 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -509,7 +509,7 @@ function node_form_submit($form, &$form_state) {
     $form_state['rebuild'] = TRUE;
   }
   // Clear the page and block caches.
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
diff --git a/core/modules/node/node.test b/core/modules/node/node.test
index 1dbcaf3..a24e7b5 100644
--- a/core/modules/node/node.test
+++ b/core/modules/node/node.test
@@ -1891,7 +1891,7 @@ class NodeBlockFunctionalTest extends NodeWebTestCase {
     $node4 = $this->drupalCreateNode($default_settings);
     // drupalCreateNode() does not automatically flush content caches unlike
     // posting a node from a node form.
-    cache_clear_all();
+    cache_clear_content();
 
     // Test that all four nodes are shown.
     $this->drupalGet('');
diff --git a/core/modules/poll/poll.module b/core/modules/poll/poll.module
index c801579..0d539be 100644
--- a/core/modules/poll/poll.module
+++ b/core/modules/poll/poll.module
@@ -756,7 +756,7 @@ function poll_vote($form, &$form_state) {
     ->condition('chid', $choice)
     ->execute();
 
-  cache_clear_all();
+  cache_clear_content();
 
   if (!$user->uid) {
     // The vote is recorded so the user gets the result view instead of the
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index aac0c3d..84f650c 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -713,7 +713,7 @@ function system_theme_settings_submit($form, &$form_state) {
   variable_set($key, $values);
   drupal_set_message(t('The configuration options have been saved.'));
 
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
diff --git a/core/modules/system/tests/cache.test b/core/modules/system/tests/cache.test
index e5d4435..7ef7523 100644
--- a/core/modules/system/tests/cache.test
+++ b/core/modules/system/tests/cache.test
@@ -349,10 +349,10 @@ class CacheClearCase extends CacheTestCase {
 
     // Set two cache objects in different bins.
     $data = $this->randomName(100);
-    cache()->set($data, $data, CACHE_TEMPORARY);
+    cache()->set($data, $data);
     $cached = cache()->get($data);
     $this->assertTrue(isset($cached->data) && $cached->data === $data, 'Cached item retrieved.');
-    cache('page')->set($data, $data, CACHE_TEMPORARY);
+    cache('page')->set($data, $data);
 
     // Expire temporary items in the 'page' bin.
     cache('page')->expire();
diff --git a/core/modules/system/tests/menu.test b/core/modules/system/tests/menu.test
index 8d1d651..64d75ab 100644
--- a/core/modules/system/tests/menu.test
+++ b/core/modules/system/tests/menu.test
@@ -354,7 +354,7 @@ class MenuRouterTestCase extends DrupalWebTestCase {
       ->condition('customized', 0)
       ->condition('module', 'menu_test')
       ->execute();
-    menu_cache_clear_all();
+    menu_cache_clear_content();
 
     // Load front page.
     $this->drupalGet('');
diff --git a/core/modules/taxonomy/taxonomy.admin.inc b/core/modules/taxonomy/taxonomy.admin.inc
index a95b856..bc24497 100644
--- a/core/modules/taxonomy/taxonomy.admin.inc
+++ b/core/modules/taxonomy/taxonomy.admin.inc
@@ -822,7 +822,7 @@ function taxonomy_form_term_submit($form, &$form_state) {
       drupal_set_message(t('Updated term %term.', array('%term' => $term->name)));
       watchdog('taxonomy', 'Updated term %term.', array('%term' => $term->name), WATCHDOG_NOTICE, l(t('edit'), 'taxonomy/term/' . $term->tid . '/edit'));
       // Clear the page and block caches to avoid stale data.
-      cache_clear_all();
+      cache_clear_content();
       break;
   }
 
@@ -921,7 +921,7 @@ function taxonomy_term_confirm_delete_submit($form, &$form_state) {
   if (!isset($_GET['destination'])) {
     $form_state['redirect'] = 'admin/structure/taxonomy';
   }
-  cache_clear_all();
+  cache_clear_content();
   return;
 }
 
@@ -961,7 +961,7 @@ function taxonomy_vocabulary_confirm_delete_submit($form, &$form_state) {
   drupal_set_message(t('Deleted vocabulary %name.', array('%name' => $form_state['values']['name'])));
   watchdog('taxonomy', 'Deleted vocabulary %name.', array('%name' => $form_state['values']['name']), WATCHDOG_NOTICE);
   $form_state['redirect'] = 'admin/structure/taxonomy';
-  cache_clear_all();
+  cache_clear_content();
   return;
 }
 
diff --git a/core/modules/taxonomy/taxonomy.entity.inc b/core/modules/taxonomy/taxonomy.entity.inc
index 3562580..5aadcea 100644
--- a/core/modules/taxonomy/taxonomy.entity.inc
+++ b/core/modules/taxonomy/taxonomy.entity.inc
@@ -360,6 +360,6 @@ class TaxonomyVocabularyController extends EntityDatabaseStorageController {
   public function resetCache(array $ids = NULL) {
     drupal_static_reset('taxonomy_vocabulary_get_names');
     parent::resetCache($ids);
-    cache_clear_all();
+    cache_clear_content();
   }
 }
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index ea9aec2..3cbbd18 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -838,7 +838,7 @@ function _update_cache_clear($cid = NULL, $wildcard = FALSE) {
  * something, in which case, we want to check for available update data again.
  * However, because we have our own caching system, we need to directly clear
  * the database table ourselves at this point and return nothing, for example,
- * on sites that use memcache where cache_clear_all() won't know how to purge
+ * on sites that use memcache where cache_clear_content() won't know how to purge
  * this data.
  *
  * However, we only want to do this from update.php, since otherwise, we'd
diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc
index f7d4552..d976659 100644
--- a/core/modules/user/user.admin.inc
+++ b/core/modules/user/user.admin.inc
@@ -737,7 +737,7 @@ function user_admin_permissions_submit($form, &$form_state) {
   drupal_set_message(t('The changes have been saved.'));
 
   // Clear the cached pages and blocks.
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 3b1d9cb..ed5e1c5 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -2420,7 +2420,7 @@ function _user_cancel($edit, $account, $method) {
   }
 
   // Clear the cache for anonymous users.
-  cache_clear_all();
+  cache_clear_content();
 }
 
 /**
diff --git a/core/modules/user/user.pages.inc b/core/modules/user/user.pages.inc
index f24849c..e356719 100644
--- a/core/modules/user/user.pages.inc
+++ b/core/modules/user/user.pages.inc
@@ -284,7 +284,7 @@ function user_profile_form_submit($form, &$form_state) {
     unset($_SESSION['pass_reset_'. $account->uid]);
   }
   // Clear the page cache because pages can contain usernames and/or profile information:
-  cache_clear_all();
+  cache_clear_content();
 
   drupal_set_message(t('The changes have been saved.'));
 }
