diff --git a/core/includes/common.inc b/core/includes/common.inc
index f3d8f2c..a5adb41 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -3,6 +3,7 @@
 use Symfony\Component\DependencyInjection\Container;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\Yaml\Yaml;
 use Drupal\Component\PhpStorage\PhpStorageFactory;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\CacheBackendInterface;
@@ -2483,7 +2484,7 @@ function drupal_add_html_head_link($attributes, $header = FALSE) {
  *     enabled, this should be set to TRUE if the stylesheet is present on every
  *     page of the website for users for whom it is present at all. This
  *     defaults to FALSE. It is set to TRUE for stylesheets added via module and
- *     theme .info files. Modules that add stylesheets within hook_init()
+ *     theme .info.yml files. Modules that add stylesheets within hook_init()
  *     implementations, or from other code that ensures that the stylesheet is
  *     added to all website pages, should also set this flag to TRUE. All
  *     stylesheets within the same group that have the 'every_page' flag set to
@@ -3228,7 +3229,7 @@ function drupal_load_stylesheet($file, $optimize = NULL, $reset_basepath = TRUE)
   $basepath = dirname($file);
 
   // Load the CSS stylesheet. We suppress errors because themes may specify
-  // stylesheets in their .info file that don't exist in the theme's path,
+  // stylesheets in their .info.yml file that don't exist in the theme's path,
   // but are merely there to disable certain module CSS files.
   if ($contents = @file_get_contents($file)) {
     // Return the processed stylesheet.
@@ -3607,7 +3608,7 @@ function drupal_region_class($region) {
  *     enabled, this should be set to TRUE if the JavaScript is present on every
  *     page of the website for users for whom it is present at all. This
  *     defaults to FALSE. It is set to TRUE for JavaScript files that are added
- *     via module and theme .info files. Modules that add JavaScript within
+ *     via module and theme .info.yml files. Modules that add JavaScript within
  *     hook_init() implementations, or from other code that ensures that the
  *     JavaScript is added to all website pages, should also set this flag to
  *     TRUE. All JavaScript files within the same group and that have the
@@ -6148,39 +6149,39 @@ function element_set_attributes(array &$element, array $map) {
 }
 
 /**
- * Parses Drupal module and theme .info files.
+ * Parses Drupal module and theme .info.yml files.
  *
  * Info files are NOT for placing arbitrary theme and module-specific settings.
- * Use variable_get() and variable_set() for that.
+ * Use variable_get() and variable_set() for that. Info files are formatted as
+ * YAML. If the 'version' key is set to 'VERSION' in any info file, then the
+ * value will be substituted with the current version of Drupal core.
  *
- * Information stored in a module .info file:
+ * Information stored in a module .info.yml file:
  * - name: The real name of the module for display purposes.
  * - description: A brief description of the module.
  * - dependencies: An array of shortnames of other modules this module requires.
  * - package: The name of the package of modules this module belongs to.
  *
- * See forum.info for an example of a module .info file.
+ * See forum.info.yml for an example of a module .info.yml file.
  *
- * Information stored in a theme .info file:
+ * Information stored in a theme .info.yml file:
  * - name: The real name of the theme for display purposes.
  * - description: Brief description.
- * - screenshot: Path to screenshot relative to the theme's .info file.
+ * - screenshot: Path to screenshot relative to the theme's .info.yml file.
  * - engine: Theme engine; typically phptemplate.
- * - base: Name of a base theme, if applicable; e.g., base = zen.
- * - regions: Listed regions; e.g., region[left] = Left sidebar.
- * - features: Features available; e.g., features[] = logo.
- * - stylesheets: Theme stylesheets; e.g., stylesheets[all][] = my-style.css.
- * - scripts: Theme scripts; e.g., scripts[] = my-script.js.
+ * - base theme: Name of a base theme, if applicable
+ * - regions: Listed regions
+ * - features: Features available
+ * - stylesheets: Theme stylesheets
+ * - scripts: Theme scripts
  *
- * See bartik.info for an example of a theme .info file.
+ * See bartik.info.yml for an example of a theme .info.yml file.
  *
- * @param $filename
+ * @param string $filename
  *   The file we are parsing. Accepts file with relative or absolute path.
  *
- * @return
+ * @return array
  *   The info array.
- *
- * @see drupal_parse_info_format()
  */
 function drupal_parse_info_file($filename) {
   $info = &drupal_static(__FUNCTION__, array());
@@ -6191,104 +6192,13 @@ function drupal_parse_info_file($filename) {
     }
     else {
       $data = file_get_contents($filename);
-      $info[$filename] = drupal_parse_info_format($data);
-    }
-  }
-  return $info[$filename];
-}
-
-/**
- * Parses data in Drupal's .info format.
- *
- * Data should be in an .ini-like format to specify values. White-space
- * generally doesn't matter, except inside values:
- * @code
- *   key = value
- *   key = "value"
- *   key = 'value'
- *   key = "multi-line
- *   value"
- *   key = 'multi-line
- *   value'
- *   key
- *   =
- *   'value'
- * @endcode
- *
- * Arrays are created using a HTTP GET alike syntax:
- * @code
- *   key[] = "numeric array"
- *   key[index] = "associative array"
- *   key[index][] = "nested numeric array"
- *   key[index][index] = "nested associative array"
- * @endcode
- *
- * PHP constants are substituted in, but only when used as the entire value.
- * Comments should start with a semi-colon at the beginning of a line.
- *
- * @param $data
- *   A string to parse.
- *
- * @return
- *   The info array.
- *
- * @see drupal_parse_info_file()
- */
-function drupal_parse_info_format($data) {
-  $info = array();
-  $constants = get_defined_constants();
-
-  if (preg_match_all('
-    @^\s*                           # Start at the beginning of a line, ignoring leading whitespace
-    ((?:
-      [^=;\[\]]|                    # Key names cannot contain equal signs, semi-colons or square brackets,
-      \[[^\[\]]*\]                  # unless they are balanced and not nested
-    )+?)
-    \s*=\s*                         # Key/value pairs are separated by equal signs (ignoring white-space)
-    (?:
-      ("(?:[^"]|(?<=\\\\)")*")|     # Double-quoted string, which may contain slash-escaped quotes/slashes
-      (\'(?:[^\']|(?<=\\\\)\')*\')| # Single-quoted string, which may contain slash-escaped quotes/slashes
-      ([^\r\n]*?)                   # Non-quoted string
-    )\s*$                           # Stop at the next end of a line, ignoring trailing whitespace
-    @msx', $data, $matches, PREG_SET_ORDER)) {
-    foreach ($matches as $match) {
-      // Fetch the key and value string.
-      $i = 0;
-      foreach (array('key', 'value1', 'value2', 'value3') as $var) {
-        $$var = isset($match[++$i]) ? $match[$i] : '';
+      $info[$filename] = Yaml::parse($filename);
+      if (isset($info[$filename]['version']) && $info[$filename]['version'] === 'VERSION') {
+        $info[$filename]['version'] = VERSION;
       }
-      $value = stripslashes(substr($value1, 1, -1)) . stripslashes(substr($value2, 1, -1)) . $value3;
-
-      // Parse array syntax.
-      $keys = preg_split('/\]?\[/', rtrim($key, ']'));
-      $last = array_pop($keys);
-      $parent = &$info;
-
-      // Create nested arrays.
-      foreach ($keys as $key) {
-        if ($key == '') {
-          $key = count($parent);
-        }
-        if (!isset($parent[$key]) || !is_array($parent[$key])) {
-          $parent[$key] = array();
-        }
-        $parent = &$parent[$key];
-      }
-
-      // Handle PHP constants.
-      if (isset($constants[$value])) {
-        $value = $constants[$value];
-      }
-
-      // Insert actual value.
-      if ($last == '') {
-        $last = count($parent);
-      }
-      $parent[$last] = $value;
     }
   }
-
-  return $info;
+  return $info[$filename];
 }
 
 /**
diff --git a/core/includes/image.inc b/core/includes/image.inc
index f0b91bf..2f15eb3 100644
--- a/core/includes/image.inc
+++ b/core/includes/image.inc
@@ -24,7 +24,7 @@
  *
  * Image toolkits are discovered based on the associated module's
  * hook_image_toolkits. Additionally the image toolkit include file
- * must be identified in the files array in the module.info file. The
+ * must be identified in the files array in the module.info.yml file. The
  * toolkit must then be enabled using the admin/config/media/image-toolkit
  * form.
  *
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 01bde01..022ab17 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -185,7 +185,7 @@ function install_state_defaults() {
     // redirect.
     'parameters_changed' => FALSE,
     // An array of information about the chosen installation profile. This will
-    // be filled in based on the profile's .info file.
+    // be filled in based on the profile's .info.yml file.
     'profile_info' => array(),
     // An array of available installation profiles.
     'profiles' => array(),
@@ -1231,7 +1231,7 @@ function install_select_profile_form($form, &$form_state, $install_state) {
 
   foreach ($names as $profile => $name) {
     // The profile name and description are extracted for translation from the
-    // .info file, so we can use st() on them even though they are dynamic data
+    // .info.yml file, so we can use st() on them even though they are dynamic data
     // at this point.
     $form['profile'][$name] = array(
       '#type' => 'radio',
diff --git a/core/includes/install.inc b/core/includes/install.inc
index e9d666f..2df611c 100644
--- a/core/includes/install.inc
+++ b/core/includes/install.inc
@@ -84,7 +84,7 @@ function drupal_load_updates() {
  * Loads the installation profile, extracting its defined distribution name.
  *
  * @return
- *   The distribution name defined in the profile's .info file. Defaults to
+ *   The distribution name defined in the profile's .info.yml file. Defaults to
  *   "Drupal" if none is explicitly provided by the installation profile.
  *
  * @see install_profile_info()
@@ -859,17 +859,17 @@ function drupal_check_module($module) {
 }
 
 /**
- * Retrieves information about an installation profile from its .info file.
+ * Retrieves information about an installation profile from its .info.yml file.
  *
- * The information stored in a profile .info file is similar to that stored in
- * a normal Drupal module .info file. For example:
+ * The information stored in a profile .info.yml file is similar to that stored
+ * in a normal Drupal module .info.yml file. For example:
  * - name: The real name of the installation profile for display purposes.
  * - description: A brief description of the profile.
  * - dependencies: An array of shortnames of other modules that this install
  *   profile requires.
  *
- * Additional, less commonly-used information that can appear in a profile.info
- * file but not in a normal Drupal module .info file includes:
+ * Additional, less commonly-used information that can appear in a
+ * profile.info.yml file but not in a normal Drupal module .info.yml file includes:
  * - distribution_name: The name of the Drupal distribution that is being
  *   installed, to be shown throughout the installation process. Defaults to
  *   'Drupal'.
@@ -884,7 +884,7 @@ function drupal_check_module($module) {
  * information for dependencies. If you only need information from the info
  * file itself, use system_get_info().
  *
- * Example of .info file:
+ * Example of .info.yml file:
  * @code
  *    name = Minimal
  *    description = Start fresh, with only a few modules enabled.
@@ -913,7 +913,7 @@ function install_profile_info($profile, $langcode = 'en') {
       'hidden' => FALSE,
       'php' => DRUPAL_MINIMUM_PHP,
     );
-    $profile_file = drupal_get_path('profile', $profile) . "/$profile.info";
+    $profile_file = drupal_get_path('profile', $profile) . "/$profile.info.yml";
     $info = drupal_parse_info_file($profile_file);
     $info += $defaults;
     $info['dependencies'] = array_unique(array_merge(
diff --git a/core/includes/module.inc b/core/includes/module.inc
index d99b39d..fd834b1 100644
--- a/core/includes/module.inc
+++ b/core/includes/module.inc
@@ -631,7 +631,7 @@ function module_uninstall($module_list = array(), $uninstall_dependents = TRUE)
  * Returns an array of modules required by core.
  */
 function drupal_required_modules() {
-  $files = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', 'modules');
+  $files = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info.yml$/', 'modules');
   $required = array();
 
   // An installation profile is required and one must always be loaded.
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index a38dbe0..0698ddf 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -121,7 +121,7 @@ function drupal_theme_initialize() {
  * @param $theme
  *   An object with the following information:
  *     filename
- *       The .info file for this theme. The 'path' to
+ *       The .info.yml file for this theme. The 'path' to
  *       the theme will be in this file's directory. (Required)
  *     owner
  *       The path to the .theme file or the .engine file to load for
@@ -693,22 +693,22 @@ function _theme_build_registry($theme, $base_theme, $theme_engine) {
  *   An associative array of the currently available themes. The keys are the
  *   themes' machine names and the values are objects having the following
  *   properties:
- *   - filename: The filepath and name of the .info file.
+ *   - filename: The filepath and name of the .info.yml file.
  *   - name: The machine name of the theme.
  *   - status: 1 for enabled, 0 for disabled themes.
- *   - info: The contents of the .info file.
+ *   - info: The contents of the .info.yml file.
  *   - stylesheets: A two dimensional array, using the first key for the
  *     media attribute (e.g. 'all'), the second for the name of the file
  *     (e.g. style.css). The value is a complete filepath (e.g.
  *     themes/bartik/style.css). Not set if no stylesheets are defined in the
- *     .info file.
+ *     .info.yml file.
  *   - scripts: An associative array of JavaScripts, using the filename as key
  *     and the complete filepath as value. Not set if no scripts are defined in
- *     the .info file.
+ *     the .info.yml file.
  *   - prefix: The base theme engine prefix.
  *   - engine: The machine name of the theme engine.
  *   - base_theme: If this is a sub-theme, the machine name of the base theme
- *     defined in the .info file. Otherwise, the element is not set.
+ *     defined in the .info.yml file. Otherwise, the element is not set.
  *   - base_themes: If this is a sub-theme, an associative array of the
  *     base-theme ancestors of this theme, starting with this theme's base
  *     theme, then the base theme's own base theme, etc. Each entry has an
@@ -1366,8 +1366,8 @@ function drupal_find_theme_templates($cache, $extension, $path) {
  * The final setting is obtained from the last value found in the following
  * sources:
  * - the default global settings specified in this function
- * - the default theme-specific settings defined in any base theme's .info file
- * - the default theme-specific settings defined in the theme's .info file
+ * - the default theme-specific settings defined in any base theme's .info.yml file
+ * - the default theme-specific settings defined in the theme's .info.yml file
  * - the saved values from the global theme settings form
  * - the saved values from the theme's settings form
  * To only retrieve the default global theme setting, an empty string should be
@@ -1407,7 +1407,7 @@ function theme_get_setting($setting_name, $theme = NULL) {
       $cache[$theme]['toggle_' . $feature] = 1;
     }
 
-    // Get the values for the theme-specific settings from the .info files of
+    // Get the values for the theme-specific settings from the .info.yml files of
     // the theme and all its base themes.
     if ($theme) {
       $themes = list_themes();
diff --git a/core/includes/theme.maintenance.inc b/core/includes/theme.maintenance.inc
index 0b426e2..932928f 100644
--- a/core/includes/theme.maintenance.inc
+++ b/core/includes/theme.maintenance.inc
@@ -64,7 +64,7 @@ function _drupal_maintenance_theme() {
   $themes = list_themes();
 
   // list_themes() triggers a drupal_alter() in maintenance mode, but we can't
-  // let themes alter the .info data until we know a theme's base themes. So
+  // let themes alter the .info.yml data until we know a theme's base themes. So
   // don't set global $theme until after list_themes() builds its cache.
   $theme = $custom_theme;
 
diff --git a/core/lib/Drupal/Core/SystemListingInfo.php b/core/lib/Drupal/Core/SystemListingInfo.php
index 8d45e1d..a07aed0 100644
--- a/core/lib/Drupal/Core/SystemListingInfo.php
+++ b/core/lib/Drupal/Core/SystemListingInfo.php
@@ -54,8 +54,8 @@ protected function process(array $files, array $files_to_add) {
     foreach (array_intersect_key($files_to_add, $files) as $file_key => $file) {
       // If it has no info file, then we just behave liberally and accept the
       // new resource on the list for merging.
-      if (file_exists($info_file = dirname($file->uri) . '/' . $file->name . '.info')) {
-        // Get the .info file for the module or theme this file belongs to.
+      if (file_exists($info_file = dirname($file->uri) . '/' . $file->name . '.info.yml')) {
+        // Get the .info.yml file for the module or theme this file belongs to.
         $info = drupal_parse_info_file($info_file);
 
         // If the module or theme is incompatible with Drupal core, remove it
diff --git a/core/lib/Drupal/Core/Updater/Updater.php b/core/lib/Drupal/Core/Updater/Updater.php
index 37a8d70..cdd4e4e 100644
--- a/core/lib/Drupal/Core/Updater/Updater.php
+++ b/core/lib/Drupal/Core/Updater/Updater.php
@@ -94,7 +94,7 @@ public static function getUpdaterFromDirectory($directory) {
    *   Path to the info file.
    */
   public static function findInfoFile($directory) {
-    $info_files = file_scan_directory($directory, '/.*\.info$/');
+    $info_files = file_scan_directory($directory, '/.*\.info.yml$/');
     if (!$info_files) {
       return FALSE;
     }
diff --git a/core/lib/Drupal/Core/Utility/ModuleInfo.php b/core/lib/Drupal/Core/Utility/ModuleInfo.php
index 9ab2ea6..eca0874 100644
--- a/core/lib/Drupal/Core/Utility/ModuleInfo.php
+++ b/core/lib/Drupal/Core/Utility/ModuleInfo.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Utility\CacheArray;
 
 /**
- * Extends CacheArray to lazy load .info properties for modules.
+ * Extends CacheArray to lazy load .info.yml properties for modules.
  *
  * Use system_get_module_info() rather than instantiating this class directly.
  */
diff --git a/core/modules/block/lib/Drupal/block/BlockListController.php b/core/modules/block/lib/Drupal/block/BlockListController.php
index d21e1a9..786907e 100644
--- a/core/modules/block/lib/Drupal/block/BlockListController.php
+++ b/core/modules/block/lib/Drupal/block/BlockListController.php
@@ -77,7 +77,7 @@ protected function sort(Block $a, Block $b) {
     if ($status) {
       return $status;
     }
-    // Sort by region (in the order defined by theme .info file).
+    // Sort by region (in the order defined by theme .info.yml file).
     $aregion = $a->get('region');
     $bregion = $b->get('region');
     if ((!empty($aregion) && !empty($bregion)) && ($place = ($regions[$aregion] - $regions[$bregion]))) {
diff --git a/core/modules/block/tests/block_test.module b/core/modules/block/tests/block_test.module
index 03f94b0..6abb95f 100644
--- a/core/modules/block/tests/block_test.module
+++ b/core/modules/block/tests/block_test.module
@@ -9,6 +9,6 @@
  * Implements hook_system_theme_info().
  */
 function block_test_system_theme_info() {
-  $themes['block_test_theme'] = drupal_get_path('module', 'block_test') . '/themes/block_test_theme/block_test_theme.info';
+  $themes['block_test_theme'] = drupal_get_path('module', 'block_test') . '/themes/block_test_theme/block_test_theme.info.yml';
   return $themes;
 }
diff --git a/core/modules/breakpoint/tests/breakpoint_theme_test.module b/core/modules/breakpoint/tests/breakpoint_theme_test.module
index 50b5ff0..765cc50 100644
--- a/core/modules/breakpoint/tests/breakpoint_theme_test.module
+++ b/core/modules/breakpoint/tests/breakpoint_theme_test.module
@@ -8,6 +8,6 @@
  * Implements hook_system_theme_info().
  */
 function breakpoint_theme_test_system_theme_info() {
-  $themes['breakpoint_test_theme'] = drupal_get_path('module', 'breakpoint_theme_test') . '/themes/breakpoint_test_theme/breakpoint_test_theme.info';
+  $themes['breakpoint_test_theme'] = drupal_get_path('module', 'breakpoint_theme_test') . '/themes/breakpoint_test_theme/breakpoint_test_theme.info.yml';
   return $themes;
 }
diff --git a/core/modules/layout/tests/layout_test.module b/core/modules/layout/tests/layout_test.module
index 74de123..0e84a95 100644
--- a/core/modules/layout/tests/layout_test.module
+++ b/core/modules/layout/tests/layout_test.module
@@ -46,6 +46,6 @@ function layout_test_page() {
  * Implements hook_system_theme_info().
  */
 function layout_test_system_theme_info() {
-  $themes['layout_test_theme'] = drupal_get_path('module', 'layout_test') . '/themes/layout_test_theme/layout_test_theme.info';
+  $themes['layout_test_theme'] = drupal_get_path('module', 'layout_test') . '/themes/layout_test_theme/layout_test_theme.info.yml';
   return $themes;
 }
diff --git a/core/modules/locale/locale.api.php b/core/modules/locale/locale.api.php
index 5005018..383050b 100644
--- a/core/modules/locale/locale.api.php
+++ b/core/modules/locale/locale.api.php
@@ -9,10 +9,10 @@
  * @defgroup interface_translation_properties Interface translation properties
  * @{
  *
- * .info file properties for interface translation settings.
+ * .info.yml file properties for interface translation settings.
  *
  * For modules hosted on drupal.org, a project definition is automatically added
- * to the .info file. Only modules with this project definition are discovered
+ * to the .info.yml file. Only modules with this project definition are discovered
  * by the update module and use it to check for new releases. Locale module uses
  * the same data to build a list of modules to check for new translations.
  * Therefore modules not hosted at drupal.org, such as custom modules, custom
@@ -21,10 +21,10 @@
  *
  * Custom modules which contain new strings should provide po file(s) containing
  * source strings and string translations in gettext format. The translation
- * file can be located both local and remote. Use the following .info file
+ * file can be located both local and remote. Use the following .info.yml file
  * properties to inform Locale module to load and import the translations.
  *
- * Example .info file properties for a custom module with a po file located in
+ * Example .info.yml file properties for a custom module with a po file located in
  * the module's folder.
  * @code
  * interface translation project = example_module
@@ -47,22 +47,22 @@
  * the same project/code tree. Both "interface translation project" and
  * "interface translation server pattern" definitions of these modules should match.
  *
- * Example .info file properties for a custom module with a po file located on
- * a remote translation server.
+ * Example .info.yml file properties for a custom module with a po file located
+ * on a remote translation server.
  * @code
  * interface translation project = example_module
  * interface translation server pattern = http://example.com/files/translations/%core/%project/%project-%version.%language.po
  * @endcode
  *
- * Custom themes, features and distributions can implement these .info file
- * properties in their .info file too.
+ * Custom themes, features and distributions can implement these .info.yml file
+ * properties in their .info.yml file too.
  *
  * To change the interface translation settings of modules and themes hosted at
  * drupal.org use hook_locale_translation_projects_alter(). Possible changes
  * include changing the po file location (server pattern) or removing the
  * project from the translation update list.
  *
- * Available .info file properties:
+ * Available .info.yml file properties:
  * - "interface translation project": project name. Required.
  *   Name of the project a (sub-)module belongs to. Multiple modules sharing
  *   the same project name will be listed as one the translation status list.
diff --git a/core/modules/locale/locale.compare.inc b/core/modules/locale/locale.compare.inc
index 267cd9d..327c821 100644
--- a/core/modules/locale/locale.compare.inc
+++ b/core/modules/locale/locale.compare.inc
@@ -50,7 +50,7 @@ function locale_translation_build_projects() {
     return array();
   }
 
-  // Get the project list based on .info files.
+  // Get the project list based on .info.yml files.
   $projects = locale_translation_project_list();
 
   // Mark all previous projects as disabled and store new project data.
@@ -128,7 +128,7 @@ function locale_translation_build_projects() {
  * Fetch an array of projects for translation update.
  *
  * @return array
- *   Array of project data including .info file data.
+ *   Array of project data including .info.yml file data.
  */
 function locale_translation_project_list() {
   // This function depends on Update module. We degrade gracefully.
@@ -164,22 +164,22 @@ function locale_translation_project_list() {
 /**
  * Prepare module and theme data.
  *
- * Modify .info file data before it is processed by update_process_info_list().
+ * Modify .info.yml file data before it is processed by update_process_info_list().
  * In order for update_process_info_list() to recognize a project, it requires
- * the 'project' parameter in the .info file data.
+ * the 'project' parameter in the .info.yml file data.
  *
  * Custom modules or themes can bring their own gettext translation file. To
  * enable import of this file the module or theme defines "interface translation
- * project = myproject" in its .info file. This function will add a project
+ * project = myproject" in its .info.yml file. This function will add a project
  * "myproject" to the info data.
  *
  * @param array $data
- *   Array of .info file data.
+ *   Array of .info.yml file data.
  * @param string $type
  *   The project type. i.e. module, theme.
  *
  * @return array
- *   Array of .info file data.
+ *   Array of .info.yml file data.
  */
 function _locale_translation_prepare_project_list($data, $type) {
   foreach ($data as $name => $file) {
@@ -356,7 +356,7 @@ function _locale_translation_batch_status_operations($projects, $langcodes) {
  * path to the po source files. If no server_pattern is defined the default
  * translation directory is checked for the po file. When a server_pattern is
  * defined the specified location is checked. The server_pattern can be set in
- * the module's .info file or by using hook_locale_translation_projects_alter().
+ * the module's .info.yml file or by using hook_locale_translation_projects_alter().
  *
  * @param array $projects
  *   Array of project names for which to check the state of translation files.
diff --git a/core/modules/locale/locale.translation.inc b/core/modules/locale/locale.translation.inc
index d6060f6..ce4f6ac 100644
--- a/core/modules/locale/locale.translation.inc
+++ b/core/modules/locale/locale.translation.inc
@@ -152,7 +152,7 @@ function locale_translation_build_sources($projects = array(), $langcodes = arra
  * The "local" files property of the source object contains the definition of a
  * po file we are looking for. The file name defaults to
  * %project-%version.%language.po. Per project this value can be overridden
- * using the server_pattern directive in the module's .info file or by using
+ * using the server_pattern directive in the module's .info.yml file or by using
  * hook_locale_translation_projects_alter().
  *
  * @param object $source
diff --git a/core/modules/locale/tests/modules/locale_test_translate/locale_test_translate.module b/core/modules/locale/tests/modules/locale_test_translate/locale_test_translate.module
index 98eb358..498099f 100644
--- a/core/modules/locale/tests/modules/locale_test_translate/locale_test_translate.module
+++ b/core/modules/locale/tests/modules/locale_test_translate/locale_test_translate.module
@@ -9,7 +9,7 @@
  * Implements hook_system_info_alter().
  *
  * By default this modules is hidden but once enabled it behaves like a normal
- * (not hidden) module. This hook implementation changes the .info data by
+ * (not hidden) module. This hook implementation changes the .info.yml data by
  * setting the hidden status to FALSE.
  */
 function locale_test_translate_system_info_alter(&$info, $file, $type) {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php
index 27ea1d7..2256c4e 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php
@@ -33,7 +33,7 @@ function testDrupalGetFilename() {
     $this->assertIdentical(drupal_get_filename('module', 'php'), 'core/modules/php/php.module', 'Retrieve module location.');
 
     // Retrieving the location of a theme.
-    $this->assertIdentical(drupal_get_filename('theme', 'stark'), 'core/themes/stark/stark.info', 'Retrieve theme location.');
+    $this->assertIdentical(drupal_get_filename('theme', 'stark'), 'core/themes/stark/stark.info.yml', 'Retrieve theme location.');
 
     // Retrieving the location of a theme engine.
     $this->assertIdentical(drupal_get_filename('theme_engine', 'phptemplate'), 'core/themes/engines/phptemplate/phptemplate.engine', 'Retrieve theme engine location.');
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php
index e4cb0f3..84999cb 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/ParseInfoFileUnitTest.php
@@ -15,14 +15,14 @@
 class ParseInfoFileUnitTest extends UnitTestBase {
   public static function getInfo() {
     return array(
-      'name' => 'Parsing .info files',
+      'name' => 'Parsing .info.yml files',
       'description' => 'Tests the drupal_parse_info_file() API function.',
       'group' => 'Common',
     );
   }
 
   /**
-   * Parses an example .info file and verifies the results.
+   * Parses an example .info.yml file and verifies the results.
    */
   function testParseInfoFile() {
     $info_values = drupal_parse_info_file(drupal_get_path('module', 'system') . '/tests/common_test_info.txt');
diff --git a/core/modules/system/lib/Drupal/system/Tests/FileTransfer/FileTransferTest.php b/core/modules/system/lib/Drupal/system/Tests/FileTransfer/FileTransferTest.php
index e106e04..080e8fd 100644
--- a/core/modules/system/lib/Drupal/system/Tests/FileTransfer/FileTransferTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/FileTransfer/FileTransferTest.php
@@ -35,7 +35,7 @@ function setUp() {
   function _getFakeModuleFiles() {
     $files = array(
       'fake.module',
-      'fake.info',
+      'fake.info.yml',
       'theme' => array(
         'fake.tpl.php'
       ),
diff --git a/core/modules/system/lib/Drupal/system/Tests/Module/ModuleApiTest.php b/core/modules/system/lib/Drupal/system/Tests/Module/ModuleApiTest.php
index 75ce7cd..264e3cf 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Module/ModuleApiTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Module/ModuleApiTest.php
@@ -255,11 +255,11 @@ function testModuleMetaData() {
     // Generate the list of available modules.
     $modules = system_rebuild_module_data();
     // Check that the mtime field exists for the system module.
-    $this->assertTrue(!empty($modules['system']->info['mtime']), 'The system.info file modification time field is present.');
+    $this->assertTrue(!empty($modules['system']->info['mtime']), 'The system.info.yml file modification time field is present.');
     // Use 0 if mtime isn't present, to avoid an array index notice.
     $test_mtime = !empty($modules['system']->info['mtime']) ? $modules['system']->info['mtime'] : 0;
     // Ensure the mtime field contains a number that is greater than zero.
-    $this->assertTrue(is_numeric($test_mtime) && ($test_mtime > 0), 'The system.info file modification time field contains a timestamp.');
+    $this->assertTrue(is_numeric($test_mtime) && ($test_mtime > 0), 'The system.info.yml file modification time field contains a timestamp.');
   }
 
   /**
@@ -269,10 +269,10 @@ function testThemeMetaData() {
     // Generate the list of available themes.
     $themes = system_rebuild_theme_data();
     // Check that the mtime field exists for the bartik theme.
-    $this->assertTrue(!empty($themes['bartik']->info['mtime']), 'The bartik.info file modification time field is present.');
+    $this->assertTrue(!empty($themes['bartik']->info['mtime']), 'The bartik.info.yml file modification time field is present.');
     // Use 0 if mtime isn't present, to avoid an array index notice.
     $test_mtime = !empty($themes['bartik']->info['mtime']) ? $themes['bartik']->info['mtime'] : 0;
     // Ensure the mtime field contains a number that is greater than zero.
-    $this->assertTrue(is_numeric($test_mtime) && ($test_mtime > 0), 'The bartik.info file modification time field contains a timestamp.');
+    $this->assertTrue(is_numeric($test_mtime) && ($test_mtime > 0), 'The bartik.info.yml file modification time field contains a timestamp.');
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
index 670f869..aa2e1ae 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
@@ -22,7 +22,7 @@ public static function getInfo() {
   }
 
   /**
-   * Tests that theme .info data is rebuild after enabling a module.
+   * Tests that theme .info.yml data is rebuild after enabling a module.
    *
    * Tests that info data is rebuilt after a module that implements
    * hook_system_info_alter() is enabled. Also tests if core *_list() functions
@@ -45,7 +45,7 @@ function testSystemInfoAlter() {
     $list_themes = list_themes();
     $this->assertTrue(isset($list_themes['seven']->info['regions']['test_region']), 'Altered theme info was returned by list_themes().');
 
-    // Disable the module and verify that rebuilt .info does not contain it.
+    // Disable the module and verify that rebuilt .info.yml does not contain it.
     module_disable(array('module_test'), FALSE);
     $this->assertFalse(module_exists('module_test'), 'Test module is disabled.');
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/InfoFileParserUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/System/InfoFileParserUnitTest.php
deleted file mode 100644
index 4f7a1c9..0000000
--- a/core/modules/system/lib/Drupal/system/Tests/System/InfoFileParserUnitTest.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\system\Tests\System\InfoFileParserUnitTest.
- */
-
-namespace Drupal\system\Tests\System;
-
-use Drupal\simpletest\UnitTestBase;
-
-class InfoFileParserUnitTest extends UnitTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Info file format parser',
-      'description' => 'Tests proper parsing of a .info file formatted string.',
-      'group' => 'System',
-    );
-  }
-
-  /**
-   * Test drupal_parse_info_format().
-   */
-  function testDrupalParseInfoFormat() {
-    $config = '
-simple = Value
-quoted = " Value"
-multiline = "Value
-  Value"
-array[] = Value1
-array[] = Value2
-array_assoc[a] = Value1
-array_assoc[b] = Value2
-array_deep[][][] = Value
-array_deep_assoc[a][b][c] = Value
-array_space[a b] = Value';
-
-    $expected = array(
-      'simple' => 'Value',
-      'quoted' => ' Value',
-      'multiline' => "Value\n  Value",
-      'array' => array(
-        0 => 'Value1',
-        1 => 'Value2',
-      ),
-      'array_assoc' => array(
-        'a' => 'Value1',
-        'b' => 'Value2',
-      ),
-      'array_deep' => array(
-        0 => array(
-          0 => array(
-            0 => 'Value',
-          ),
-        ),
-      ),
-      'array_deep_assoc' => array(
-        'a' => array(
-          'b' => array(
-            'c' => 'Value',
-          ),
-        ),
-      ),
-      'array_space' => array(
-        'a b' => 'Value',
-      ),
-    );
-
-    $parsed = drupal_parse_info_format($config);
-
-    $this->assertEqual($parsed['simple'], $expected['simple'], 'Set a simple value.');
-    $this->assertEqual($parsed['quoted'], $expected['quoted'], 'Set a simple value in quotes.');
-    $this->assertEqual($parsed['multiline'], $expected['multiline'], 'Set a multiline value.');
-    $this->assertEqual($parsed['array'], $expected['array'], 'Set a simple array.');
-    $this->assertEqual($parsed['array_assoc'], $expected['array_assoc'], 'Set an associative array.');
-    $this->assertEqual($parsed['array_deep'], $expected['array_deep'], 'Set a nested array.');
-    $this->assertEqual($parsed['array_deep_assoc'], $expected['array_deep_assoc'], 'Set a nested associative array.');
-    $this->assertEqual($parsed['array_space'], $expected['array_space'], 'Set an array with a whitespace in the key.');
-    $this->assertEqual($parsed, $expected, 'Entire parsed .info string and expected array are identical.');
-  }
-}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php
index c2b6c43..b954415 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeInfoStylesTest.php
@@ -10,7 +10,7 @@
 use Drupal\simpletest\WebTestBase;
 
 /**
- * Tests processing of theme .info stylesheets.
+ * Tests processing of theme .info.yml stylesheets.
  */
 class ThemeInfoStylesTest extends WebTestBase {
 
@@ -23,8 +23,8 @@ class ThemeInfoStylesTest extends WebTestBase {
 
   public static function getInfo() {
     return array(
-      'name' => 'Theme .info styles',
-      'description' => 'Tests processing of theme .info stylesheets.',
+      'name' => 'Theme .info.yml styles',
+      'description' => 'Tests processing of theme .info.yml stylesheets.',
       'group' => 'Theme',
     );
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
index 6e9b383..6588995 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
@@ -102,20 +102,20 @@ function testAlter() {
   }
 
   /**
-   * Ensures a theme's .info file is able to override a module CSS file from being added to the page.
+   * Ensures a theme's .info.yml file is able to override a module CSS file from being added to the page.
    *
-   * @see test_theme.info
+   * @see test_theme.info.yml
    */
   function testCSSOverride() {
     // Reuse the same page as in testPreprocessForSuggestions(). We're testing
-    // what is output to the HTML HEAD based on what is in a theme's .info file,
-    // so it doesn't matter what page we get, as long as it is themed with the
-    // test theme. First we test with CSS aggregation disabled.
+    // what is output to the HTML HEAD based on what is in a theme's .info.yml
+    // file, so it doesn't matter what page we get, as long as it is themed with
+    // the test theme. First we test with CSS aggregation disabled.
     $config = config('system.performance');
     $config->set('css.preprocess', 0);
     $config->save();
     $this->drupalGet('theme-test/suggestion');
-    $this->assertNoText('system.base.css', 'The theme\'s .info file is able to override a module CSS file from being added to the page.');
+    $this->assertNoText('system.base.css', 'The theme\'s .info.yml file is able to override a module CSS file from being added to the page.');
 
     // Also test with aggregation enabled, simply ensuring no PHP errors are
     // triggered during drupal_build_css_cache() when a source file doesn't
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 37a2bf2..5846d23 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -571,7 +571,7 @@ function system_theme_settings($form, &$form_state, $key = '') {
     // Process the theme and all its base themes.
     foreach ($theme_keys as $theme) {
       // Include the theme-settings.php file.
-      $filename = DRUPAL_ROOT . '/' . str_replace("/$theme.info", '', $themes[$theme]->filename) . '/theme-settings.php';
+      $filename = DRUPAL_ROOT . '/' . str_replace("/$theme.info.yml", '', $themes[$theme]->filename) . '/theme-settings.php';
       if (file_exists($filename)) {
         require_once $filename;
       }
@@ -769,9 +769,10 @@ function _system_is_incompatible(&$incompatible, $files, $file) {
 /**
  * Menu callback; provides module enable/disable interface.
  *
- * The list of modules gets populated by module.info files, which contain each
- * module's name, description, and information about which modules it requires.
- * See drupal_parse_info_file() for information on module.info descriptors.
+ * The list of modules gets populated by module.info.yml files, which contain
+ * each module's name, description, and information about which modules it
+ * requires.
+ * See drupal_parse_info_file() for information on module.info.yml descriptors.
  *
  * Dependency checking is performed to ensure that a module:
  * - can not be enabled if there are disabled modules it requires.
@@ -1316,7 +1317,7 @@ function system_modules_uninstall_confirm_form($storage) {
 
   // Construct the hidden form elements and list items.
   foreach (array_filter($storage['uninstall']) as $module => $value) {
-    $info = drupal_parse_info_file(drupal_get_path('module', $module) . '/' . $module . '.info');
+    $info = drupal_parse_info_file(drupal_get_path('module', $module) . '/' . $module . '.info.yml');
     $uninstall[] = $info['name'];
     $form['uninstall'][$module] = array('#type' => 'hidden',
       '#value' => 1,
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 7e95a03..746b03e 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1511,8 +1511,8 @@ function hook_init() {
  * Define image toolkits provided by this module.
  *
  * The file which includes each toolkit's functions must be declared as part of
- * the files array in the module .info file so that the registry will find and
- * parse it.
+ * the files array in the module .info.yml file so that the registry will find
+ * and parse it.
  *
  * The toolkit's functions must be named image_toolkitname_operation().
  * where the operation may be:
@@ -1649,32 +1649,32 @@ function hook_module_implements_alter(&$implementations, $hook) {
  *
  * @return
  *   An associative array. Each key is the system name of a theme and each value
- *   is the corresponding path to the theme's .info file.
+ *   is the corresponding path to the theme's .info.yml file.
  */
 function hook_system_theme_info() {
-  $themes['mymodule_test_theme'] = drupal_get_path('module', 'mymodule') . '/mymodule_test_theme/mymodule_test_theme.info';
+  $themes['mymodule_test_theme'] = drupal_get_path('module', 'mymodule') . '/mymodule_test_theme/mymodule_test_theme.info.yml';
   return $themes;
 }
 
 /**
- * Alter the information parsed from module and theme .info files
+ * Alter the information parsed from module and theme .info.yml files
  *
  * This hook is invoked in _system_rebuild_module_data() and in
  * _system_rebuild_theme_data(). A module may implement this hook in order to
- * add to or alter the data generated by reading the .info file with
+ * add to or alter the data generated by reading the .info.yml file with
  * drupal_parse_info_file().
  *
  * @param $info
- *   The .info file contents, passed by reference so that it can be altered.
+ *   The .info.yml file contents, passed by reference so that it can be altered.
  * @param $file
  *   Full information about the module or theme, including $file->name, and
  *   $file->filename
  * @param $type
- *   Either 'module' or 'theme', depending on the type of .info file that was
+ *   Either 'module' or 'theme', depending on the type of .info.yml file that was
  *   passed.
  */
 function hook_system_info_alter(&$info, $file, $type) {
-  // Only fill this in if the .info file does not define a 'datestamp'.
+  // Only fill this in if the .info.yml file does not define a 'datestamp'.
   if (empty($info['datestamp'])) {
     $info['datestamp'] = filemtime($file->filename);
   }
@@ -2482,7 +2482,7 @@ function hook_file_url_alter(&$uri) {
  * or at least the module will not install.
  * Other severity levels have no effect on the installation.
  * Module dependencies do not belong to these installation requirements,
- * but should be defined in the module's .info file.
+ * but should be defined in the module's .info.yml file.
  *
  * The 'runtime' phase is not limited to pure installation requirements
  * but can also be used for more general status information like maintenance
@@ -3080,7 +3080,7 @@ function hook_disable() {
  * inspect later. It is important to remove any temporary variables using
  * variable_del() before your last task has completed and control is handed
  * back to the installer.
- * 
+ *
  * @param array $install_state
  *   An array of information about the current installation state.
  *
@@ -3275,7 +3275,7 @@ function hook_install_tasks_alter(&$tasks, $install_state) {
 function hook_file_mimetype_mapping_alter(&$mapping) {
   // Add new MIME type 'drupal/info'.
   $mapping['mimetypes']['example_info'] = 'drupal/info';
-  // Add new extension '.info' and map it to the 'drupal/info' MIME type.
+  // Add new extension '.info.yml' and map it to the 'drupal/info' MIME type.
   $mapping['extensions']['info'] = 'example_info';
   // Override existing extension mapping for '.ogg' files.
   $mapping['extensions']['ogg'] = 189;
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 17015c6..99bf80d 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2754,8 +2754,8 @@ function system_check_directory($form_element) {
 /**
  * Returns an array of information about enabled modules or themes.
  *
- * This function returns the contents of the .info file for each enabled module
- * or theme.
+ * This function returns the contents of the .info.yml file for each enabled
+ * module or theme.
  *
  * @param $type
  *   Either 'module' or 'theme'.
@@ -2796,14 +2796,14 @@ function system_get_info($type, $name = NULL) {
 }
 
 /**
- * Return .info data for modules.
+ * Return .info.yml data for modules.
  *
  * @param string $property
- *   The .info property to retrieve.
+ *   The .info.yml property to retrieve.
  *
  * @return array
- *   An array keyed by module name, with the .info file property as values.
- *   Only modules with the property specified in their .info file will be
+ *   An array keyed by module name, with the .info.yml file property as values.
+ *   Only modules with the property specified in their .info.yml file will be
  *   returned.
  *
  * @see Drupal\Core\Utility\ModuleInfo
@@ -2817,7 +2817,7 @@ function system_get_module_info($property) {
 }
 
 /**
- * Helper function to scan and collect module .info data.
+ * Helper function to scan and collect module .info.yml data.
  *
  * @return
  *   An associative array of module information.
@@ -2854,11 +2854,11 @@ function _system_rebuild_module_data() {
     $modules[$key]->filename = $module->uri;
 
     // Look for the info file.
-    $module->info = drupal_parse_info_file(dirname($module->uri) . '/' . $module->name . '.info');
+    $module->info = drupal_parse_info_file(dirname($module->uri) . '/' . $module->name . '.info.yml');
 
     // Add the info file modification time, so it becomes available for
     // contributed modules to use for ordering module lists.
-    $module->info['mtime'] = filemtime(dirname($module->uri) . '/' . $module->name . '.info');
+    $module->info['mtime'] = filemtime(dirname($module->uri) . '/' . $module->name . '.info.yml');
 
     // Skip modules that don't provide info.
     if (empty($module->info)) {
@@ -2870,13 +2870,13 @@ function _system_rebuild_module_data() {
     $modules[$key]->info = $module->info + $defaults;
 
     // Installation profiles are hidden by default, unless explicitly specified
-    // otherwise in the .info file.
+    // otherwise in the .info.yml file.
     if ($key == $profile && !isset($modules[$key]->info['hidden'])) {
       $modules[$key]->info['hidden'] = TRUE;
     }
 
     // Invoke hook_system_info_alter() to give installed modules a chance to
-    // modify the data in the .info files if necessary.
+    // modify the data in the .info.yml files if necessary.
     $type = 'module';
     drupal_alter('system_info', $modules[$key]->info, $modules[$key], $type);
   }
@@ -2948,14 +2948,14 @@ function _system_update_bootstrap_status() {
 }
 
 /**
- * Helper function to scan and collect theme .info data and their engines.
+ * Helper function to scan and collect theme .info.yml data and their engines.
  *
  * @return
  *   An associative array of themes information.
  */
 function _system_rebuild_theme_data() {
   // Find themes
-  $themes = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', 'themes');
+  $themes = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info.yml$/', 'themes');
   // Allow modules to add further themes.
   if ($module_themes = module_invoke_all('system_theme_info')) {
     foreach ($module_themes as $name => $uri) {
@@ -3004,7 +3004,7 @@ function _system_rebuild_theme_data() {
     $themes[$key]->info['mtime'] = filemtime($theme->uri);
 
     // Invoke hook_system_info_alter() to give installed modules a chance to
-    // modify the data in the .info files if necessary.
+    // modify the data in the .info.yml files if necessary.
     $type = 'theme';
     drupal_alter('system_info', $themes[$key]->info, $themes[$key], $type);
 
@@ -3101,15 +3101,15 @@ function system_rebuild_theme_data() {
 }
 
 /**
- * Prefixes all values in an .info file array with a given path.
+ * Prefixes all values in an .info.yml file array with a given path.
  *
- * This helper function is mainly used to prefix all array values of an .info
+ * This helper function is mainly used to prefix all array values of an .info.yml
  * file property with a single given path (to the module or theme); e.g., to
  * prefix all values of the 'stylesheets' or 'scripts' properties with the file
  * path to the defining module/theme.
  *
  * @param $info
- *   A nested array of data of an .info file to be processed.
+ *   A nested array of data of an .info.yml file to be processed.
  * @param $path
  *   A file path to prepend to each value in $info.
  *
diff --git a/core/modules/system/templates/region.tpl.php b/core/modules/system/templates/region.tpl.php
index 3c82ae1..7dc569c 100644
--- a/core/modules/system/templates/region.tpl.php
+++ b/core/modules/system/templates/region.tpl.php
@@ -12,7 +12,7 @@
  *   - region: The current template type, i.e., "theming hook".
  *   - region-[name]: The name of the region with underscores replaced with
  *     dashes. For example, the page_top region would have a region-page-top class.
- * - $region: The name of the region variable as defined in the theme's .info file.
+ * - $region: The name of the region variable as defined in the theme's .info.yml file.
  *
  * Helper variables:
  * - $is_admin: Flags true when the current user is an administrator.
diff --git a/core/modules/system/tests/common_test_info.txt b/core/modules/system/tests/common_test_info.txt
index ae217b9..07c633d 100644
--- a/core/modules/system/tests/common_test_info.txt
+++ b/core/modules/system/tests/common_test_info.txt
@@ -1,9 +1,3 @@
-; Test parsing with a simple string.
-simple_string = A simple string
-
-; Test that constants can be used as values.
-simple_constant = WATCHDOG_INFO
-
-; After parsing the .info file, 'double_colon' should hold the literal value.
-; Parsing should not throw a fatal error or try to access a class constant.
-double_colon = dummyClassName::
+simple_string: A simple string
+simple_constant: VERSION
+double_colon: dummyClassName::
diff --git a/core/modules/system/tests/modules/ajax_test/ajax_test.module b/core/modules/system/tests/modules/ajax_test/ajax_test.module
index efb1966..951446a 100644
--- a/core/modules/system/tests/modules/ajax_test/ajax_test.module
+++ b/core/modules/system/tests/modules/ajax_test/ajax_test.module
@@ -43,7 +43,7 @@ function ajax_test_menu() {
  * Implements hook_system_theme_info().
  */
 function ajax_test_system_theme_info() {
-  $themes['test_theme'] = drupal_get_path('module', 'system') . '/tests/themes/test_theme/test_theme.info';
+  $themes['test_theme'] = drupal_get_path('module', 'system') . '/tests/themes/test_theme/test_theme.info.yml';
   return $themes;
 }
 
diff --git a/core/modules/system/tests/modules/theme_page_test/theme_page_test.module b/core/modules/system/tests/modules/theme_page_test/theme_page_test.module
index 63f8cb4..6fdd7bd 100644
--- a/core/modules/system/tests/modules/theme_page_test/theme_page_test.module
+++ b/core/modules/system/tests/modules/theme_page_test/theme_page_test.module
@@ -15,7 +15,7 @@ function theme_page_test_system_info_alter(&$info, $file, $type) {
  * Implements hook_system_theme_info().
  */
 function theme_page_test_system_theme_info() {
-  $themes['test_invalid_basetheme'] = drupal_get_path('module', 'system') . '/tests/themes/test_invalid_basetheme/test_invalid_basetheme.info';
-  $themes['test_invalid_engine'] = drupal_get_path('module', 'system') . '/tests/themes/test_invalid_engine/test_invalid_engine.info';
+  $themes['test_invalid_basetheme'] = drupal_get_path('module', 'system') . '/tests/themes/test_invalid_basetheme/test_invalid_basetheme.info.yml';
+  $themes['test_invalid_engine'] = drupal_get_path('module', 'system') . '/tests/themes/test_invalid_engine/test_invalid_engine.info.yml';
   return $themes;
 }
diff --git a/core/modules/system/tests/modules/theme_test/theme_test.module b/core/modules/system/tests/modules/theme_test/theme_test.module
index 73ff44b..137fdfc 100644
--- a/core/modules/system/tests/modules/theme_test/theme_test.module
+++ b/core/modules/system/tests/modules/theme_test/theme_test.module
@@ -24,10 +24,10 @@ function theme_test_theme($existing, $type, $theme, $path) {
  * Implements hook_system_theme_info().
  */
 function theme_test_system_theme_info() {
-  $themes['test_theme'] = drupal_get_path('module', 'system') . '/tests/themes/test_theme/test_theme.info';
-  $themes['test_basetheme'] = drupal_get_path('module', 'system') . '/tests/themes/test_basetheme/test_basetheme.info';
-  $themes['test_subtheme'] = drupal_get_path('module', 'system') . '/tests/themes/test_subtheme/test_subtheme.info';
-  $themes['test_theme_twig'] = drupal_get_path('module', 'system') . '/tests/themes/test_theme_twig/test_theme_twig.info';
+  $themes['test_theme'] = drupal_get_path('module', 'system') . '/tests/themes/test_theme/test_theme.info.yml';
+  $themes['test_basetheme'] = drupal_get_path('module', 'system') . '/tests/themes/test_basetheme/test_basetheme.info.yml';
+  $themes['test_subtheme'] = drupal_get_path('module', 'system') . '/tests/themes/test_subtheme/test_subtheme.info.yml';
+  $themes['test_theme_twig'] = drupal_get_path('module', 'system') . '/tests/themes/test_theme_twig/test_theme_twig.info.yml';
   return $themes;
 }
 
@@ -112,10 +112,10 @@ function theme_test_template_test_page_callback() {
 }
 
 /**
- * Page callback; Adds stylesheets to test theme .info property processing.
+ * Page callback; Adds stylesheets to test theme .info.yml property processing.
  *
- * @see test_basetheme.info
- * @see test_subtheme.info
+ * @see test_basetheme.info.yml
+ * @see test_subtheme.info.yml
  * @see \Drupal\system\Tests\Theme\ThemeInfoStylesTest
  * @see http://drupal.org/node/967266#comment-3689670
  */
diff --git a/core/modules/update/tests/modules/update_test/update_test.module b/core/modules/update/tests/modules/update_test/update_test.module
index 078bcf5..99aa453 100644
--- a/core/modules/update/tests/modules/update_test/update_test.module
+++ b/core/modules/update/tests/modules/update_test/update_test.module
@@ -45,9 +45,9 @@ function update_test_menu() {
  * Checks the 'update_test.settings:system_info' configuration and sees if we
  * need to alter the system info for the given $file based on the setting. The
  * setting is expected to be a nested associative array. If the key '#all' is
- * defined, its subarray will include .info keys and values for all modules and
- * themes on the system. Otherwise, the settings array is keyed by the module or
- * theme short name ($file->name) and the subarrays contain settings just for
+ * defined, its subarray will include .info.yml keys and values for all modules
+ * and themes on the system. Otherwise, the settings array is keyed by the module
+ * or theme short name ($file->name) and the subarrays contain settings just for
  * that module or theme.
  */
 function update_test_system_info_alter(&$info, $file) {
@@ -67,7 +67,7 @@ function update_test_system_info_alter(&$info, $file) {
  * Checks the 'update_test.settings:update_status' configuration and sees if we
  * need to alter the update status for the given project based on the setting.
  * The setting is expected to be a nested associative array. If the key '#all'
- * is defined, its subarray will include .info keys and values for all modules
+ * is defined, its subarray will include .info.yml keys and values for all modules
  * and themes on the system. Otherwise, the settings array is keyed by the
  * module or theme short name and the subarrays contain settings just for that
  * module or theme.
diff --git a/core/modules/update/update.api.php b/core/modules/update/update.api.php
index 8dd23e9..b5621dd 100644
--- a/core/modules/update/update.api.php
+++ b/core/modules/update/update.api.php
@@ -43,19 +43,19 @@ function hook_update_projects_alter(&$projects) {
   $projects['disabled_project_name'] = array(
     // Machine-readable project short name (same as the array key above).
     'name' => 'disabled_project_name',
-    // Array of values from the main .info file for this project.
+    // Array of values from the main .info.yml file for this project.
     'info' => array(
       'name' => 'Some disabled module',
       'description' => 'A module not enabled on the site that you want to see in the available updates report.',
       'version' => '8.x-1.0',
       'core' => '8.x',
       // The maximum file change time (the "ctime" returned by the filectime()
-      // PHP method) for all of the .info files included in this project.
+      // PHP method) for all of the .info.yml files included in this project.
       '_info_file_ctime' => 1243888165,
     ),
     // The date stamp when the project was released, if known. If the disabled
     // project was an officially packaged release from drupal.org, this will
-    // be included in the .info file as the 'datestamp' field. This only
+    // be included in the .info.yml file as the 'datestamp' field. This only
     // really matters for development snapshot releases that are regenerated,
     // so it can be left undefined or set to 0 in most cases.
     'datestamp' => 1243888185,
diff --git a/core/modules/update/update.compare.inc b/core/modules/update/update.compare.inc
index 59ce287..e4fa8ed 100644
--- a/core/modules/update/update.compare.inc
+++ b/core/modules/update/update.compare.inc
@@ -28,13 +28,13 @@
  *   An associative array of currently enabled projects keyed by the
  *   machine-readable project short name. Each project contains:
  *   - name: The machine-readable project short name.
- *   - info: An array with values from the main .info file for this project.
+ *   - info: An array with values from the main .info.yml file for this project.
  *     - name: The human-readable name of the project.
  *     - package: The package that the project is grouped under.
  *     - version: The version of the project.
  *     - project: The Drupal.org project name.
- *     - datestamp: The date stamp of the project's main .info file.
- *     - _info_file_ctime: The maximum file change time for all of the .info
+ *     - datestamp: The date stamp of the project's main .info.yml file.
+ *     - _info_file_ctime: The maximum file change time for all of the .info.yml
  *       files included in this project.
  *   - datestamp: The date stamp when the project was released, if known.
  *   - includes: An associative array containing all projects included with this
@@ -87,7 +87,7 @@ function update_get_projects() {
  * should be included or not in the 'Available updates' report), those are only
  * processed after $projects has been populated with information about the
  * enabled code. Modules and themes set as hidden are always ignored. This
- * function also records the latest change time on the .info files for each
+ * function also records the latest change time on the .info.yml files for each
  * module or theme, which is important data which is used when deciding if the
  * cached available update data should be invalidated.
  *
@@ -101,7 +101,7 @@ function update_get_projects() {
  *   Boolean that controls what status (enabled or disabled) to process out of
  *   the $list and add to the $projects array.
  * @param $additional_whitelist
- *   (optional) Array of additional elements to be collected from the .info
+ *   (optional) Array of additional elements to be collected from the .info.yml
  *   file. Defaults to array().
  *
  * @see update_get_projects()
@@ -129,7 +129,7 @@ function update_process_info_list(&$projects, $list, $project_type, $status, $ad
       continue;
     }
 
-    // Skip if the .info file is broken.
+    // Skip if the .info.yml file is broken.
     if (empty($file->info)) {
       continue;
     }
@@ -139,7 +139,7 @@ function update_process_info_list(&$projects, $list, $project_type, $status, $ad
       continue;
     }
 
-    // If the .info doesn't define the 'project', try to figure it out.
+    // If the .info.yml doesn't define the 'project', try to figure it out.
     if (!isset($file->info['project'])) {
       $file->info['project'] = update_get_project_name($file);
     }
@@ -149,15 +149,15 @@ function update_process_info_list(&$projects, $list, $project_type, $status, $ad
       continue;
     }
 
-    // If we don't already know it, grab the change time on the .info file
+    // If we don't already know it, grab the change time on the .info.yml file
     // itself. Note: we need to use the ctime, not the mtime (modification
     // time) since many (all?) tar implementations will go out of their way to
     // set the mtime on the files it creates to the timestamps recorded in the
     // tarball. We want to see the last time the file was changed on disk,
-    // which is left alone by tar and correctly set to the time the .info file
+    // which is left alone by tar and correctly set to the time the .info.yml file
     // was unpacked.
     if (!isset($file->info['_info_file_ctime'])) {
-      $info_filename = dirname($file->uri) . '/' . $file->name . '.info';
+      $info_filename = dirname($file->uri) . '/' . $file->name . '.info.yml';
       $file->info['_info_file_ctime'] = filectime($info_filename);
     }
 
@@ -201,7 +201,7 @@ function update_process_info_list(&$projects, $list, $project_type, $status, $ad
       // project can have multiple modules or themes.
       $projects[$project_name] = array(
         'name' => $project_name,
-        // Only save attributes from the .info file we care about so we do not
+        // Only save attributes from the .info.yml file we care about so we do not
         // bloat our RAM usage needlessly.
         'info' => update_filter_project_info($file->info, $additional_whitelist),
         'datestamp' => $file->info['datestamp'],
@@ -293,7 +293,7 @@ function update_process_project_info(&$projects) {
       elseif (!isset($info['major'])) {
         // This would only happen for version strings that don't follow the
         // drupal.org convention. We let contribs define "major" in their
-        // .info in this case, and only if that's missing would we hit this.
+        // .info.yml in this case, and only if that's missing would we hit this.
         $info['major'] = -1;
       }
     }
@@ -656,7 +656,7 @@ function update_calculate_project_update_status(&$project_data, $available) {
     // If we're running a dev snapshot and have a timestamp, stop
     // searching for security updates once we hit an official release
     // older than what we've got. Allow 100 seconds of leeway to handle
-    // differences between the datestamp in the .info file and the
+    // differences between the datestamp in the .info.yml file and the
     // timestamp of the tarball itself (which are usually off by 1 or 2
     // seconds) so that we don't flag that as a new release.
     if ($project_data['install_type'] == 'dev') {
@@ -753,7 +753,7 @@ function update_calculate_project_update_status(&$project_data, $available) {
  * Retrieves data from {cache_update} or empties the cache when necessary.
  *
  * Two very expensive arrays computed by this module are the list of all
- * installed modules and themes (and .info data, project associations, etc), and
+ * installed modules and themes (and .info.yml data, project associations, etc), and
  * the current status of the site relative to the currently available releases.
  * These two arrays are cached in the {cache_update} table and used whenever
  * possible. The cache is cleared whenever the administrator visits the status
@@ -806,16 +806,16 @@ function update_project_cache($cid) {
 }
 
 /**
- * Filters the project .info data to only save attributes we need.
+ * Filters the project .info.yml data to only save attributes we need.
  *
  * @param array $info
- *   Array of .info file data as returned by drupal_parse_info_file().
+ *   Array of .info.yml file data as returned by drupal_parse_info_file().
  * @param $additional_whitelist
- *   (optional) Array of additional elements to be collected from the .info
+ *   (optional) Array of additional elements to be collected from the .info.yml
  *   file. Defaults to array().
  *
  * @return
- *   Array of .info file data we need for the update manager.
+ *   Array of .info.yml file data we need for the update manager.
  *
  * @see update_process_info_list()
  */
diff --git a/core/modules/update/update.fetch.inc b/core/modules/update/update.fetch.inc
index d5f3593..476739a 100644
--- a/core/modules/update/update.fetch.inc
+++ b/core/modules/update/update.fetch.inc
@@ -232,7 +232,7 @@ function _update_refresh() {
  * @param $project
  *   Associative array of information about a project as created by
  *   update_get_projects(), including keys such as 'name' (short name), and the
- *   'info' array with data from a .info file for the project.
+ *   'info' array with data from a .info.yml file for the project.
  *
  * @see update_get_projects()
  * @see update_get_available()
@@ -272,8 +272,8 @@ function _update_create_fetch_task($project) {
 /**
  * Generates the URL to fetch information about project updates.
  *
- * This figures out the right URL to use, based on the project's .info file and
- * the global defaults. Appends optional query arguments when the site is
+ * This figures out the right URL to use, based on the project's .info.yml file
+ * and the global defaults. Appends optional query arguments when the site is
  * configured to report usage stats.
  *
  * @param $project
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index 00ef879..830c8d2 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -367,12 +367,12 @@ function _update_no_data() {
  * Tries to get update information from cache and refreshes it when necessary.
  *
  * In addition to checking the cache lifetime, this function also ensures that
- * there are no .info files for enabled modules or themes that have a newer
+ * there are no .info.yml files for enabled modules or themes that have a newer
  * modification timestamp than the last time we checked for available update
- * data. If any .info file was modified, it almost certainly means a new version
- * of something was installed. Without fresh available update data, the logic in
- * update_calculate_project_data() will be wrong and produce confusing, bogus
- * results.
+ * data. If any .info.yml file was modified, it almost certainly means a new
+ * version of something was installed. Without fresh available update data, the
+ * logic in update_calculate_project_data() will be wrong and produce confusing,
+ * bogus results.
  *
  * @param $refresh
  *   (optional) Boolean to indicate if this method should refresh the cache
@@ -401,9 +401,9 @@ function update_get_available($refresh = FALSE) {
       continue;
     }
 
-    // See if the .info file is newer than the last time we checked for data,
+    // See if the .info.yml file is newer than the last time we checked for data,
     // and if so, mark this project's data as needing to be re-fetched. Any
-    // time an admin upgrades their local installation, the .info file will
+    // time an admin upgrades their local installation, the .info.yml file will
     // be changed, so this is the only way we can be sure we're not showing
     // bogus information right after they upgrade.
     if ($project['info']['_info_file_ctime'] > $available[$key]['last_fetch']) {
@@ -667,7 +667,7 @@ function theme_update_last_check($variables) {
  * update manager does not yet support. See http://drupal.org/node/606592
  *
  * Then, we make sure that at least one module included in the archive file has
- * an .info file which claims that the code is compatible with the current
+ * an .info.yml file which claims that the code is compatible with the current
  * version of Drupal core.
  *
  * @see drupal_system_listing()
@@ -689,16 +689,16 @@ function update_verify_update_archive($project, $archive_file, $directory) {
     );
   }
 
-  // Parse all the .info files and make sure at least one is compatible with
+  // Parse all the .info.yml files and make sure at least one is compatible with
   // this version of Drupal core. If one is compatible, then the project as a
   // whole is considered compatible (since, for example, the project may ship
   // with some out-of-date modules that are not necessary for its overall
   // functionality).
   $compatible_project = FALSE;
   $incompatible = array();
-  $files = file_scan_directory("$directory/$project", '/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', array('key' => 'name', 'min_depth' => 0));
+  $files = file_scan_directory("$directory/$project", '/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info.yml$/', array('key' => 'name', 'min_depth' => 0));
   foreach ($files as $key => $file) {
-    // Get the .info file for the module or theme this file belongs to.
+    // Get the .info.yml file for the module or theme this file belongs to.
     $info = drupal_parse_info_file($file->uri);
 
     // If the module or theme is incompatible with Drupal core, set an error.
@@ -712,7 +712,7 @@ function update_verify_update_archive($project, $archive_file, $directory) {
   }
 
   if (empty($files)) {
-    $errors[] = t('%archive_file does not contain any .info files.', array('%archive_file' => drupal_basename($archive_file)));
+    $errors[] = t('%archive_file does not contain any .info.yml files.', array('%archive_file' => drupal_basename($archive_file)));
   }
   elseif (!$compatible_project) {
     $errors[] = format_plural(
