diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index a646096..e1ae91a 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -225,6 +225,8 @@ public static function database() {
    *
    * @return \Drupal\Core\Cache\CacheBackendInterface
    *   The cache object associated with the specified bin.
+   *
+   * @ingroup cache
    */
   public static function cache($bin = 'cache') {
     return static::$container->get('cache.' . $bin);
diff --git a/core/lib/Drupal/Core/Cache/BackendChain.php b/core/lib/Drupal/Core/Cache/BackendChain.php
index 5a20ff6..4d8ca05 100644
--- a/core/lib/Drupal/Core/Cache/BackendChain.php
+++ b/core/lib/Drupal/Core/Cache/BackendChain.php
@@ -19,6 +19,8 @@
  * volatile backend but found in the persistent one will be propagated back up
  * to ensure fast retrieval on the next request. On cache sets and deletes, both
  * backends will be invoked to ensure consistency.
+ *
+ * @ingroup cache
  */
 
 class BackendChain implements CacheBackendInterface {
diff --git a/core/lib/Drupal/Core/Cache/Cache.php b/core/lib/Drupal/Core/Cache/Cache.php
index c2f5fe6..f224d14 100644
--- a/core/lib/Drupal/Core/Cache/Cache.php
+++ b/core/lib/Drupal/Core/Cache/Cache.php
@@ -9,6 +9,8 @@
 
 /**
  * Helper methods for cache.
+ *
+ * @ingroup cache
  */
 class Cache {
 
diff --git a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
index 3bdbc64..0208b77 100644
--- a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
+++ b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
@@ -14,60 +14,7 @@
  * Drupal\Core\Cache\DatabaseBackend provides the default implementation, which
  * can be consulted as an example.
  *
- * To make Drupal use your implementation for a certain cache bin, you have to
- * set a variable with the name of the cache bin as its key and the name of
- * your class as its value. For example, if your implementation of
- * Drupal\Core\Cache\CacheBackendInterface was called MyCustomCache, the
- * following line would make Drupal use it for the 'cache_page' bin:
- * @code
- *  $settings['cache_classes']['cache_page'] = 'MyCustomCache';
- * @endcode
- *
- * Additionally, you can register your cache implementation to be used by
- * default for all cache bins by setting the $settings['cache_classes'] variable and
- * changing the value of the 'cache' key to the name of your implementation of
- * the Drupal\Core\Cache\CacheBackendInterface, e.g.
- * @code
- *  $settings['cache_classes']['cache'] = 'MyCustomCache';
- * @endcode
- *
- * To implement a completely custom cache bin, use the same variable format:
- * @code
- *  $settings['cache_classes']['custom_bin'] = 'MyCustomCache';
- * @endcode
- * To access your custom cache bin, specify the name of the bin when storing
- * or retrieving cached data:
- * @code
- *  \Drupal::cache('custom_bin')->set($cid, $data, $expire);
- *  \Drupal::cache('custom_bin')->get($cid);
- * @endcode
- *
- * There are two ways to "remove" a cache item:
- * - Deletion (using delete(), deleteMultiple(), deleteTags() or deleteAll()):
- *   Permanently removes the item from the cache.
- * - Invalidation (using invalidate(), invalidateMultiple(), invalidateTags()
- *   or invalidateAll()): a "soft" delete that only marks the items as
- *   "invalid", meaning "not fresh" or "not fresh enough". Invalid items are
- *   not usually returned from the cache, so in most ways they behave as if they
- *   have been deleted. However, it is possible to retrieve the invalid entries,
- *   if they have not yet been permanently removed by the garbage collector, by
- *   passing TRUE as the second argument for get($cid, $allow_invalid).
- *
- * Cache items should be deleted if they are no longer considered useful. This
- * is relevant e.g. if the cache item contains references to data that has been
- * deleted. On the other hand, it may be relevant to just invalidate the item
- * if the cached data may be useful to some callers until the cache item has
- * been updated with fresh data. The fact that it was fresh a short while ago
- * may often be sufficient.
- *
- * Invalidation is particularly useful to protect against stampedes. Rather than
- * having multiple concurrent requests updating the same cache item when it
- * expires or is deleted, there can be one request updating the cache, while
- * the other requests can proceed using the stale value. As soon as the cache
- * item has been updated, all future requests will use the updated value.
- *
- * @see \Drupal::cache()
- * @see \Drupal\Core\Cache\DatabaseBackend
+ * @ingroup cache
  */
 interface CacheBackendInterface {
 
diff --git a/core/lib/Drupal/Core/Cache/CacheCollector.php b/core/lib/Drupal/Core/Cache/CacheCollector.php
index 5971cf1..53139b8 100644
--- a/core/lib/Drupal/Core/Cache/CacheCollector.php
+++ b/core/lib/Drupal/Core/Cache/CacheCollector.php
@@ -22,6 +22,8 @@
  * CacheCollector->has() needs to correctly return (equivalent to
  * array_key_exists() vs. isset()). This should not be necessary in the majority
  * of cases.
+ *
+ * @ingroup cache
  */
 abstract class CacheCollector implements CacheCollectorInterface, DestructableInterface {
 
diff --git a/core/lib/Drupal/Core/Cache/CacheCollectorInterface.php b/core/lib/Drupal/Core/Cache/CacheCollectorInterface.php
index 9d51e95..27f4538 100644
--- a/core/lib/Drupal/Core/Cache/CacheCollectorInterface.php
+++ b/core/lib/Drupal/Core/Cache/CacheCollectorInterface.php
@@ -18,6 +18,8 @@
  * request, and memory usage from static caches of that same data.
  *
  * The default implementation is \Drupal\Core\Cache\CacheCollector.
+ *
+ * @ingroup cache
  */
 interface CacheCollectorInterface {
 
diff --git a/core/lib/Drupal/Core/Cache/CacheableInterface.php b/core/lib/Drupal/Core/Cache/CacheableInterface.php
index da4f04c..2a59467 100644
--- a/core/lib/Drupal/Core/Cache/CacheableInterface.php
+++ b/core/lib/Drupal/Core/Cache/CacheableInterface.php
@@ -8,6 +8,8 @@
 
 /**
  * Defines an interface for objects which are potentially cacheable.
+ *
+ * @ingroup cache
  */
 interface CacheableInterface {
 
diff --git a/core/lib/Drupal/Core/Cache/DatabaseBackend.php b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
index 4f98c50..cf2b264 100644
--- a/core/lib/Drupal/Core/Cache/DatabaseBackend.php
+++ b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
@@ -15,6 +15,8 @@
  *
  * This is Drupal's default cache implementation. It uses the database to store
  * cached data. Each cache bin corresponds to a database table by the same name.
+ *
+ * @ingroup cache
  */
 class DatabaseBackend implements CacheBackendInterface {
 
diff --git a/core/lib/Drupal/Core/Cache/MemoryBackend.php b/core/lib/Drupal/Core/Cache/MemoryBackend.php
index a7faca6..c4e16f7 100644
--- a/core/lib/Drupal/Core/Cache/MemoryBackend.php
+++ b/core/lib/Drupal/Core/Cache/MemoryBackend.php
@@ -15,6 +15,7 @@
  * Should be used for unit tests and specialist use-cases only, does not
  * store cached items between requests.
  *
+ * @ingroup cache
  */
 class MemoryBackend implements CacheBackendInterface {
 
diff --git a/core/lib/Drupal/Core/Cache/NullBackend.php b/core/lib/Drupal/Core/Cache/NullBackend.php
index 0364663..94a426d 100644
--- a/core/lib/Drupal/Core/Cache/NullBackend.php
+++ b/core/lib/Drupal/Core/Cache/NullBackend.php
@@ -17,6 +17,8 @@
  * operations would have a negative impact on performance.
  *
  * This also can be used for testing purposes.
+ *
+ * @ingroup cache
  */
 class NullBackend implements CacheBackendInterface {
 
diff --git a/core/modules/system/core.api.php b/core/modules/system/core.api.php
index 5d131ce..5da3657 100644
--- a/core/modules/system/core.api.php
+++ b/core/modules/system/core.api.php
@@ -171,12 +171,64 @@
 /**
  * @defgroup cache Cache API
  * @{
- * Information about the Drupal Cache API
  *
- * @todo write this
+ * @section basics Basics
  *
- * Additional documentation paragraphs need to be written, and functions,
- * classes, and interfaces need to be added to this topic.
+ * @section delete Deletion
+ *
+ * There are two ways to "remove" a cache item:
+ * - Deletion (using delete(), deleteMultiple(), deleteTags() or deleteAll()):
+ *   Permanently removes the item from the cache.
+ * - Invalidation (using invalidate(), invalidateMultiple(), invalidateTags()
+ *   or invalidateAll()): a "soft" delete that only marks the items as
+ *   "invalid", meaning "not fresh" or "not fresh enough". Invalid items are
+ *   not usually returned from the cache, so in most ways they behave as if they
+ *   have been deleted. However, it is possible to retrieve the invalid entries,
+ *   if they have not yet been permanently removed by the garbage collector, by
+ *   passing TRUE as the second argument for get($cid, $allow_invalid).
+ *
+ * Cache items should be deleted if they are no longer considered useful. This
+ * is relevant e.g. if the cache item contains references to data that has been
+ * deleted. On the other hand, it may be relevant to just invalidate the item
+ * if the cached data may be useful to some callers until the cache item has
+ * been updated with fresh data. The fact that it was fresh a short while ago
+ * may often be sufficient.
+ *
+ * Invalidation is particularly useful to protect against stampedes. Rather than
+ * having multiple concurrent requests updating the same cache item when it
+ * expires or is deleted, there can be one request updating the cache, while
+ * the other requests can proceed using the stale value. As soon as the cache
+ * item has been updated, all future requests will use the updated value.
+ *
+ * @section configuration Configuration
+ *
+ * To make Drupal use your implementation for a certain cache bin, you have to
+ * set a variable with the name of the cache bin as its key and the name of
+ * your class as its value. For example, if your implementation of
+ * Drupal\Core\Cache\CacheBackendInterface was called MyCustomCache, the
+ * following line would make Drupal use it for the 'cache_page' bin:
+ * @code
+ *  $settings['cache_classes']['cache_page'] = 'MyCustomCache';
+ * @endcode
+ *
+ * Additionally, you can register your cache implementation to be used by
+ * default for all cache bins by setting the $settings['cache_classes'] variable and
+ * changing the value of the 'cache' key to the name of your implementation of
+ * the Drupal\Core\Cache\CacheBackendInterface, e.g.
+ * @code
+ *  $settings['cache_classes']['cache'] = 'MyCustomCache';
+ * @endcode
+ *
+ * To implement a completely custom cache bin, use the same variable format:
+ * @code
+ *  $settings['cache_classes']['custom_bin'] = 'MyCustomCache';
+ * @endcode
+ * To access your custom cache bin, specify the name of the bin when storing
+ * or retrieving cached data:
+ * @code
+ *  \Drupal::cache('custom_bin')->set($cid, $data, $expire);
+ *  \Drupal::cache('custom_bin')->get($cid);
+ * @endcode
  *
  * @see https://drupal.org/node/1884796
  * @}
