diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 6648299..b1ca7c0 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -706,11 +706,17 @@ function list_themes($refresh = FALSE) {
     $list = array();
     // Extract from the database only when it is available.
     // Also check that the site is not in the middle of an install or update.
-    try {
-      $themes = system_list('theme');
+    if (!defined('MAINTENANCE_MODE')) {
+      try {
+        $themes = system_list('theme');
+      }
+      catch (Exception $e) {
+        // If the database is not available, rebuild the theme data.
+        $themes = _system_rebuild_theme_data();
+      }
     }
-    catch (Exception $e) {
-      // If the database is not available, rebuild the theme data.
+    else {
+      // Scan the installation when the database should not be read.
       $themes = _system_rebuild_theme_data();
     }
 
diff --git a/core/modules/breakpoint/breakpoint.install b/core/modules/breakpoint/breakpoint.install
new file mode 100644
index 0000000..7ee2603
--- /dev/null
+++ b/core/modules/breakpoint/breakpoint.install
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Enable, install, update and uninstall functions for the breakpoint module.
+ */
+
+/**
+ * Implements hook_install().
+ *
+ * Import breakpoints from all enabled themes.
+ */
+function breakpoint_install() {
+  // Import breakpoints from enabled themes.
+  $themes = array_filter(list_themes(), function ($theme) {return $theme->status;});
+  _breakpoint_theme_enabled(array_keys($themes));
+
+  // Import breakpoints from modules.
+  _breakpoint_modules_installed(array_keys(\Drupal::moduleHandler()->getModuleList()));
+}
diff --git a/core/modules/breakpoint/breakpoint.module b/core/modules/breakpoint/breakpoint.module
index a2450f9..d502691 100644
--- a/core/modules/breakpoint/breakpoint.module
+++ b/core/modules/breakpoint/breakpoint.module
@@ -34,6 +34,20 @@ function breakpoint_help($path, $arg) {
 }
 
 /**
+ * Implements hook_themes_enabled().
+ *
+ * @param array $theme_list
+ *   An array of theme names.
+ *
+ * @see _breakpoint_theme_enabled()
+ *
+ * @todo: This should be removed if https://drupal.org/node/1813110 is resolved.
+ */
+function breakpoint_themes_enabled($theme_list) {
+  _breakpoint_theme_enabled($theme_list);
+}
+
+/**
  * Implements hook_themes_disabled().
  *
  * @param array $theme_list
@@ -48,6 +62,20 @@ function breakpoint_themes_disabled($theme_list) {
 }
 
 /**
+ * Implements hook_modules_installed().
+ *
+ * @param array $modules
+ *   An array of the modules that were enabled.
+ *
+ * @see _breakpoint_modules_enabled()
+ *
+ * @todo: This should be removed if https://drupal.org/node/1813110 is resolved.
+ */
+function breakpoint_modules_installed($modules) {
+  _breakpoint_modules_installed($modules);
+}
+
+/**
  * Implements hook_modules_uninstalled().
  *
  * @param array $modules
@@ -62,6 +90,91 @@ function breakpoint_modules_uninstalled($modules) {
 }
 
 /**
+ * Import breakpoints from all new enabled themes.
+ *
+ * @param array $theme_list
+ *   An array of theme names.
+ */
+function _breakpoint_theme_enabled($theme_list) {
+  $themes = list_themes();
+  foreach ($theme_list as $theme_key) {
+    $media_queries = breakpoint_get_theme_media_queries($theme_key);
+    _breakpoint_import_media_queries($theme_key, $themes[$theme_key]->info['name'], Breakpoint::SOURCE_TYPE_THEME, $media_queries);
+    // Import custom groups.
+    _breakpoint_import_breakpoint_groups($theme_key, Breakpoint::SOURCE_TYPE_THEME);
+  }
+}
+
+/**
+ * Import breakpoints from all new installed modules.
+ *
+ * @param array $modules
+ *   An array of the modules that were installed.
+ */
+function _breakpoint_modules_installed($modules) {
+  foreach ($modules as $module) {
+    $media_queries = breakpoint_get_module_media_queries($module);
+    _breakpoint_import_media_queries($module, $module, Breakpoint::SOURCE_TYPE_MODULE, $media_queries);
+    // Import custom groups.
+    _breakpoint_import_breakpoint_groups($module, Breakpoint::SOURCE_TYPE_MODULE);
+  }
+}
+
+/**
+ * Import media queries from a theme or module and create a default group.
+ *
+ * @param string $group_name
+ *   Machine readable name of the breakpoint group.
+ * @param string $label
+ *   Human readable name of the breakpoint group.
+ * @param string $source_type
+ *   Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE.
+ * @param array $media_queries
+ *   An array of breakpoints in the form $breakpoint['name'] = 'media query'.
+ */
+function _breakpoint_import_media_queries($group_name, $label, $source_type, $media_queries) {
+  if (!empty($media_queries)) {
+    // Create a new breakpoint group if it doesn't exist.
+    $breakpoint_group = _breakpoint_group_create_or_load($group_name, $label, $group_name, $source_type);
+
+    // Load all media queries, create a breakpoint for each one and add them
+    // to this breakpoint group.
+    foreach ($media_queries as $name => $media_query) {
+      $breakpoint_group->addBreakpointFromMediaQuery($name, $media_query);
+    }
+
+    $breakpoint_group->save();
+  }
+}
+
+/**
+ * Import breakpoint groups from theme or module.
+ *
+ * @param string $source
+ *   The theme or module name
+ * @param string $source_type
+ *   Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE.
+ */
+function _breakpoint_import_breakpoint_groups($source, $source_type) {
+  $breakpoint_groups = \Drupal::config($source . '.breakpoint_groups');
+  if ($breakpoint_groups) {
+    foreach ($breakpoint_groups->get() as $group_name => $data) {
+      // Breakpoints is mandatory, extra check since this is coming from config.
+      if (isset($data['breakpoints']) && !empty($data['breakpoints'])) {
+        // Create a new breakpoint group if it doesn't exist.
+        $breakpoint_group = _breakpoint_group_create_or_load($group_name, isset($data['label']) ? $data['label'] : $group_name, $source, $source_type);
+        // Add the breakpoints.
+        $breakpoint_group->addBreakpoints($data['breakpoints']);
+        $breakpoint_group->save();
+      }
+      else {
+        throw new \Exception('Illegal config file detected.');
+      }
+    }
+  }
+}
+
+/**
  * Remove breakpoints from all disabled themes or uninstalled modules.
  *
  * The source type has to match the original source type, otherwise the group
@@ -133,6 +246,65 @@ function _breakpoint_delete_breakpoint_groups($group_id, $source_type) {
 }
 
 /**
+ * Get a list of available breakpoints from a specified theme.
+ *
+ * @param string $theme_key
+ *   The name of the theme.
+ *
+ * @return array
+ *   An array of breakpoints in the form $breakpoint['name'] = 'media query'.
+ */
+function breakpoint_get_theme_media_queries($theme_key) {
+  $themes = list_themes();
+  if (!isset($themes[$theme_key])) {
+    throw new \Exception('Illegal theme_key passed.');
+  }
+
+  $config = \Drupal::config($theme_key . '.breakpoints');
+  if ($config) {
+    return $config->get();
+  }
+  return array();
+}
+
+/**
+ * Get a list of available breakpoints from a specified module.
+ *
+ * @param string $module
+ *   The name of the module.
+ *
+ * @return array
+ *   An array of breakpoints in the form $breakpoint['name'] = 'media query'.
+ */
+function breakpoint_get_module_media_queries($module) {
+  if (!\Drupal::moduleHandler()->moduleExists($module)) {
+    throw new \Exception('Illegal module name passed.');
+  }
+
+  $config = \Drupal::config($module . '.breakpoints');
+  if ($config) {
+    return $config->get();
+  }
+  return array();
+}
+
+/**
+ * Load one breakpoint group by its identifier.
+ *
+ * @param string $id
+ *   The id of the breakpoint group to load.
+ *
+ * @return \Drupal\breakpoint\Entity\BreakpointGroup|null
+ *   The breakpoint group, or NULL if there is no entity with the given id.
+ *
+ * @todo Remove this in a follow-up issue.
+ * @see http://drupal.org/node/1798214
+ */
+function breakpoint_group_load($id) {
+  return entity_load('breakpoint_group', $id);
+}
+
+/**
  * Load one breakpoint by its identifier.
  *
  * @param int $id
@@ -179,3 +351,36 @@ function breakpoint_select_options() {
   asort($options);
   return $options;
 }
+
+/**
+ * Helper function to easily create/load a breakpoint group.
+ *
+ * @param string $name
+ *   Machine readable name of the breakpoint group.
+ * @param string $label
+ *   Human readable name of the breakpoint group.
+ * @param string $source
+ *   Machine readable name of the defining theme or module.
+ * @param string $source_type
+ *   Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE.
+ *
+ * @return \Drupal\breakpoint\Entity\BreakpointGroup
+ *
+ * @see _breakpoint_import_media_queries()
+ * @see _breakpoint_import_breakpoint_groups()
+ */
+function _breakpoint_group_create_or_load($name, $label, $source, $source_type) {
+  // Try loading the breakpoint group.
+  $breakpoint_group = entity_load('breakpoint_group', $source_type . '.' . $source . '.' . $name);
+  // Create a new breakpoint group if it doesn't exist.
+  if (!$breakpoint_group) {
+    // Build a new breakpoint group.
+    $breakpoint_group = entity_create('breakpoint_group', array(
+      'name' => $name,
+      'label' => $label,
+      'source' => $source,
+      'sourceType' => $source_type,
+    ));
+  }
+  return $breakpoint_group;
+}
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php
index 3bb877b..59833ff 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php
@@ -41,30 +41,8 @@ public function addBreakpointFromMediaQuery($name, $media_query);
    * The breakpoint name is either the machine_name or the ID of a breakpoint.
    *
    * @param array $breakpoints
-   *   Array containing breakpoint objects
-   *
-   * @return \Drupal\breakpoint\Entity\BreakpointGroup
-   *   The breakpoint group object.
+   *   Array containing breakpoints keyed by their ID.
    */
   public function addBreakpoints($breakpoints);
 
-  /**
-   * Gets the array of breakpoints for the breakpoint group.
-   *
-   * @return array
-   *   The array of breakpoints for the breakpoint group.
-   */
-  public function getBreakpoints();
-
-  /**
-   * Gets a breakpoint from the breakpoint group by ID.
-   *
-   * @param string $id
-   *   The breakpoint ID to get.
-   *
-   * @return \Drupal\breakpoint\Entity\Breakpoint|boolean
-   *   The breakpoint or FALSE if not in the Breakpoint group.
-   */
-  public function getBreakpointById($id);
-
 }
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php
index 19ed9b3..6a3150a 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php
@@ -63,24 +63,14 @@ class BreakpointGroup extends ConfigEntityBase implements BreakpointGroupInterfa
   public $label;
 
   /**
-   * The breakpoint group breakpoint IDs.
-   *
-   * @var array
-   *   Array containing all breakpoints IDs of this group.
-   *
-   * @see \Drupal\breakpoint\Entity\Breakpoint
-   */
-  public $breakpoint_ids = array();
-
-  /**
    * The breakpoint group breakpoints.
    *
    * @var array
-   *   Array containing all breakpoints objects of this group.
+   *   Array containing all breakpoints of this group.
    *
    * @see \Drupal\breakpoint\Entity\Breakpoint
    */
-  protected $breakpoints = array();
+  public $breakpoints = array();
 
   /**
    * The breakpoint group source: theme or module name. Use 'user' for
@@ -108,6 +98,7 @@ class BreakpointGroup extends ConfigEntityBase implements BreakpointGroupInterfa
    */
   public function __construct(array $values, $entity_type) {
     parent::__construct($values, $entity_type);
+    $this->loadAllBreakpoints();
   }
 
   /**
@@ -122,8 +113,9 @@ public function save() {
       $this->id = $this->sourceType . '.' . $this->source . '.' . $this->name;
     }
     // Only save the keys, but return the full objects.
-    // $this->breakpoint_ids = array_keys($this->getBreakpoints());
+    $this->breakpoints = array_keys($this->breakpoints);
     parent::save();
+    $this->loadAllBreakpoints();
   }
 
   /**
@@ -165,48 +157,47 @@ public function addBreakpointFromMediaQuery($name, $media_query) {
         'mediaQuery' => $media_query,
         'source' => $this->name,
         'sourceType' => $this->sourceType,
-        'weight' => count($this->breakpoint_ids),
+        'weight' => count($this->breakpoints),
       ));
       $breakpoint->save();
     }
-    return $this->addBreakpoints(array($breakpoint));
+    $this->breakpoints[$breakpoint->id()] = $breakpoint;
   }
 
   /**
    * {@inheritdoc}
    */
   public function addBreakpoints($breakpoints) {
-    foreach ($breakpoints as $breakpoint) {
-      // Add breakpoint to group.
-      $this->breakpoints[$breakpoint->id()] = $breakpoint;
-      $this->breakpoint_ids[] = $breakpoint->id();
+    foreach ($breakpoints as $breakpoint_name) {
+      // Check if breakpoint exists, assume $breakpoint_name is a machine name.
+      $breakpoint = entity_load('breakpoint', $this->sourceType . '.' . $this->source . '.' . $breakpoint_name);
+      // If the breakpoint doesn't exist, assume $breakpoint_name is an id.
+      if (!$breakpoint) {
+        $breakpoint = entity_load('breakpoint', $breakpoint_name);
+      }
+      // If the breakpoint doesn't exists, do not add it.
+      if ($breakpoint) {
+        // Add breakpoint to group.
+        $this->breakpoints[$breakpoint->id()] = $breakpoint;
+      }
     }
-    return $this;
   }
 
   /**
-   * {@inheritdoc}
+   * Loads all breakpoints, remove non-existing ones.
+   *
+   * @return array
+   *   Array containing breakpoints keyed by their id.
    */
-  public function getBreakpoints() {
-    if (empty($this->breakpoints)) {
-      foreach ($this->breakpoint_ids as $breakpoint_id) {
-        $breakpoint = breakpoint_load($breakpoint_id);
-        if ($breakpoint) {
-          $this->breakpoints[$breakpoint_id] = $breakpoint;
-        }
+  protected function loadAllBreakpoints() {
+    $breakpoints = $this->breakpoints;
+    $this->breakpoints = array();
+    foreach ($breakpoints as $breakpoint_id) {
+      $breakpoint = breakpoint_load($breakpoint_id);
+      if ($breakpoint) {
+        $this->breakpoints[$breakpoint_id] = $breakpoint;
       }
     }
-    return $this->breakpoints;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getBreakpointById($id) {
-    $breakpoints = $this->getBreakpoints();
-    if (isset($breakpoints[$id])) {
-      return $breakpoints[$id];
-    }
-    return FALSE;
-  }
 }
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php
index e9eeb00..bd5a2a8 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php
@@ -50,7 +50,8 @@ public function testBreakpointGroupCRUD() {
     $this->verifyBreakpointGroup($group);
 
     // Update the breakpoint group.
-    $group->addBreakpoints($breakpoints)->save();
+    $group->breakpoints = array_keys($breakpoints);
+    $group->save();
     $this->verifyBreakpointGroup($group);
 
     // Delete the breakpoint group.
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php
index 0531984..0f7e471 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php
@@ -33,7 +33,7 @@ public function verifyBreakpointGroup(BreakpointGroup $group, BreakpointGroup $c
       'label',
       'id',
       'name',
-      'breakpoint_ids',
+      'breakpoints',
       'sourceType',
     );
 
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
index 7a2f937..e00af05 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
@@ -47,11 +47,11 @@ public function testThemeBreakpoints() {
       'sourceType' => Breakpoint::SOURCE_TYPE_THEME,
       'id' => Breakpoint::SOURCE_TYPE_THEME . '.breakpoint_test_theme.breakpoint_test_theme',
     ));
-    $breakpoint_group_obj->breakpoint_ids = array(
-      'theme.breakpoint_test_theme.mobile',
-      'theme.breakpoint_test_theme.narrow',
-      'theme.breakpoint_test_theme.wide',
-      'theme.breakpoint_test_theme.tv',
+    $breakpoint_group_obj->breakpoints = array(
+      'theme.breakpoint_test_theme.mobile' => array(),
+      'theme.breakpoint_test_theme.narrow' => array(),
+      'theme.breakpoint_test_theme.wide' => array(),
+      'theme.breakpoint_test_theme.tv' => array(),
     );
 
     // Verify we can load this breakpoint defined by the theme.
@@ -74,10 +74,10 @@ public function testThemeBreakpointGroup() {
       'source' => 'breakpoint_test_theme',
       'id' => Breakpoint::SOURCE_TYPE_THEME . '.breakpoint_test_theme.test',
     ));
-    $breakpoint_group_obj->breakpoint_ids = array(
-      'theme.breakpoint_test_theme.mobile',
-      'theme.breakpoint_test_theme.narrow',
-      'theme.breakpoint_test_theme.wide',
+    $breakpoint_group_obj->breakpoints = array(
+      'theme.breakpoint_test_theme.mobile' => array('1.5x', '2.x'),
+      'theme.breakpoint_test_theme.narrow' => array(),
+      'theme.breakpoint_test_theme.wide' => array(),
     );
 
     // Verify we can load this breakpoint defined by the theme.
@@ -88,4 +88,39 @@ public function testThemeBreakpointGroup() {
     $this->assertFalse(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'breakpoint_group_load: Loading a deleted breakpoint group returns false.', 'Breakpoint API');
   }
 
+  /**
+   * Test the breakpoints defined by the custom group in the module.
+   */
+  public function testThemeBreakpointGroupModule() {
+    // Call the import manually, since the testbot needs to enable the module
+    // first, otherwise the theme isn't detected.
+    _breakpoint_import_breakpoint_groups('breakpoint_theme_test', Breakpoint::SOURCE_TYPE_MODULE);
+
+    // Verify the breakpoint group 'module_test' was created by
+    // breakpoint_theme_test module.
+    $breakpoint_group_obj = entity_create('breakpoint_group', array(
+      'label' => 'Test Module',
+      'name' => 'module_test',
+      'sourceType' => Breakpoint::SOURCE_TYPE_MODULE,
+      'source' => 'breakpoint_theme_test',
+      'id' => Breakpoint::SOURCE_TYPE_MODULE . '.breakpoint_theme_test.module_test',
+    ));
+    $breakpoint_group_obj->breakpoints = array(
+      'theme.breakpoint_test_theme.mobile' => array(),
+      'theme.breakpoint_test_theme.narrow' => array(),
+      'theme.breakpoint_test_theme.wide' => array(),
+    );
+
+    // Verify we can load this breakpoint defined by the theme.
+    $this->verifyBreakpointGroup($breakpoint_group_obj);
+
+    // Disable the test theme and verify the breakpoint group still exists.
+    theme_disable(array('breakpoint_test_theme'));
+    $this->assertTrue(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'Breakpoint group still exists if theme is disabled.');
+
+    // Uninstall the test module and verify the breakpoint group is deleted.
+    module_uninstall(array('breakpoint_theme_test'));
+    $this->assertFalse(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'Breakpoint group is removed if module is uninstalled.');
+  }
+
 }
diff --git a/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml b/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml
new file mode 100644
index 0000000..4e3e6f0
--- /dev/null
+++ b/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml
@@ -0,0 +1,6 @@
+module_test:
+  label: Test Module
+  breakpoints:
+    - theme.breakpoint_test_theme.mobile
+    - theme.breakpoint_test_theme.narrow
+    - theme.breakpoint_test_theme.wide
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.mobile.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.mobile.yml
deleted file mode 100644
index 3f30595..0000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.mobile.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.breakpoint_test_theme.mobile
-uuid: 3ae8bfe6-496b-478c-a811-17424038f49c
-name: mobile
-label: mobile
-mediaQuery: '(min-width: 0px)'
-source: breakpoint_test_theme
-sourceType: theme
-weight: 0
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.narrow.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.narrow.yml
deleted file mode 100644
index e0773e3..0000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.narrow.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.breakpoint_test_theme.narrow
-uuid: 1d791b4a-7ccf-4c93-a800-c2bc2594cc62
-name: narrow
-label: narrow
-mediaQuery: '(min-width: 560px)'
-source: breakpoint_test_theme
-sourceType: theme
-weight: 1
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.tv.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.tv.yml
deleted file mode 100644
index 9f4d189..0000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.tv.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.breakpoint_test_theme.tv
-uuid: e0ffa737-0570-4891-9809-9bce925673ca
-name: tv
-label: tv
-mediaQuery: 'only screen and (min-width: 3456px)'
-source: breakpoint_test_theme
-sourceType: theme
-weight: 3
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.wide.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.wide.yml
deleted file mode 100644
index 112a8e6..0000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.wide.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.breakpoint_test_theme.wide
-uuid: 1561574d-99f8-48a6-b304-4e2b617673b2
-name: wide
-label: wide
-mediaQuery: '(min-width: 851px)'
-source: breakpoint_test_theme
-sourceType: theme
-weight: 2
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.breakpoint_test_theme.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.breakpoint_test_theme.yml
deleted file mode 100644
index 62ac756..0000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.breakpoint_test_theme.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-id: theme.breakpoint_test_theme.breakpoint_test_theme
-uuid: 94b96e6e-a032-4b29-8100-efd5bf854fd1
-name: breakpoint_test_theme
-label: 'Breakpoint test theme'
-breakpoint_ids:
-  - theme.breakpoint_test_theme.mobile
-  - theme.breakpoint_test_theme.narrow
-  - theme.breakpoint_test_theme.wide
-  - theme.breakpoint_test_theme.tv
-source: breakpoint_test_theme
-sourceType: theme
-status: true
-langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.test.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.test.yml
deleted file mode 100644
index e185e7f..0000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.test.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.breakpoint_test_theme.test
-uuid: fcc25180-7e18-4149-8962-98d706faa59a
-name: test
-label: 'Test Theme'
-breakpoint_ids:
-  - theme.breakpoint_test_theme.mobile
-  - theme.breakpoint_test_theme.narrow
-  - theme.breakpoint_test_theme.wide
-source: breakpoint_test_theme
-sourceType: theme
-status: true
-langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml
new file mode 100644
index 0000000..bde92d8
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml
@@ -0,0 +1,6 @@
+test:
+  label: Test Theme
+  breakpoints:
+    - mobile
+    - narrow
+    - wide
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoints.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoints.yml
new file mode 100644
index 0000000..534fbf5
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoints.yml
@@ -0,0 +1,4 @@
+mobile: '(min-width: 0px)'
+narrow: '(min-width: 560px)'
+wide: '(min-width: 851px)'
+tv: 'only screen and (min-width: 3456px)'
diff --git a/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php b/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php
index a1f4d91..c5a6e98 100644
--- a/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php
+++ b/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php
@@ -129,7 +129,7 @@ protected function loadAllMappings() {
     $loaded_mappings = $this->mappings;
     $this->mappings = array();
     if ($this->breakpointGroup) {
-      foreach ($this->breakpointGroup->getBreakpoints() as $breakpoint_id => $breakpoint) {
+      foreach ($this->breakpointGroup->breakpoints as $breakpoint_id => $breakpoint) {
         // Get the mapping for the default multiplier.
         $this->mappings[$breakpoint_id]['1x'] = '';
         if (isset($loaded_mappings[$breakpoint_id]['1x'])) {
diff --git a/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php b/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
index 18f4022..3c3ce34 100644
--- a/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
+++ b/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
@@ -73,8 +73,7 @@ public function form(array $form, array &$form_state) {
     $image_styles = image_style_options(TRUE);
     foreach ($picture_mapping->mappings as $breakpoint_id => $mapping) {
       foreach ($mapping as $multiplier => $image_style) {
-        $breakpoint = $picture_mapping->breakpointGroup->getBreakpointById($breakpoint_id);
-        $label = $multiplier . ' ' . $breakpoint->name . ' [' . $breakpoint->mediaQuery . ']';
+        $label = $multiplier . ' ' . $picture_mapping->breakpointGroup->breakpoints[$breakpoint_id]->name . ' [' . $picture_mapping->breakpointGroup->breakpoints[$breakpoint_id]->mediaQuery . ']';
         $form['mappings'][$breakpoint_id][$multiplier] = array(
           '#type' => 'select',
           '#title' => check_plain($label),
diff --git a/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php b/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
index a28e5fb..f34b37a 100644
--- a/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
+++ b/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
@@ -133,8 +133,9 @@ public function viewElements(FieldItemListInterface $items) {
           // Make sure that the breakpoint exists and is enabled.
           // @todo add the following when breakpoint->status is added again:
           // $picture_mapping->breakpointGroup->breakpoints[$breakpoint_name]->status
-          $breakpoint = $picture_mapping->breakpointGroup->getBreakpointById($breakpoint_name);
-          if ($breakpoint) {
+          if (isset($picture_mapping->breakpointGroup->breakpoints[$breakpoint_name])) {
+            $breakpoint = $picture_mapping->breakpointGroup->breakpoints[$breakpoint_name];
+
             // Determine the enabled multipliers.
             $multipliers = array_intersect_key($multipliers, $breakpoint->multipliers);
             foreach ($multipliers as $multiplier => $image_style) {
diff --git a/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php b/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
index 3b908db..b023fe5 100644
--- a/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
+++ b/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
@@ -67,7 +67,7 @@ public function setUp() {
         ),
       ));
       $breakpoint->save();
-      $breakpoint_group->addBreakpoints(array($breakpoint));
+      $breakpoint_group->breakpoints[$breakpoint->id()] = $breakpoint;
     }
     $breakpoint_group->save();
 
diff --git a/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php b/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
index 7c11a6f..c19b63c 100644
--- a/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
+++ b/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
@@ -77,7 +77,7 @@ public function setUp() {
         ),
       ));
       $breakpoint->save();
-      $breakpoint_group->addBreakpoints(array($breakpoint));
+      $breakpoint_group->breakpoints[$breakpoint->id()] = $breakpoint;
     }
     $breakpoint_group->save();
 
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.narrow.yml b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.narrow.yml
deleted file mode 100644
index 742e76f..0000000
--- a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.narrow.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: module.toolbar.narrow
-uuid: cb5e5f7c-b443-4d0b-ae5e-948ba336a0cb
-name: narrow
-label: narrow
-mediaQuery: 'only screen and (min-width: 16.5em)'
-source: toolbar
-sourceType: module
-weight: 0
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.standard.yml b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.standard.yml
deleted file mode 100644
index e5c5c33..0000000
--- a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.standard.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: module.toolbar.standard
-uuid: 19981d7a-2dc3-4b3f-be00-a4d8a7c12c07
-name: standard
-label: standard
-mediaQuery: 'only screen and (min-width: 38.125em)'
-source: toolbar
-sourceType: module
-weight: 1
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.wide.yml b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.wide.yml
deleted file mode 100644
index ab5ed2f..0000000
--- a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.wide.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: module.toolbar.wide
-uuid: 8797545b-0b39-493d-8c00-b4ae721bf447
-name: wide
-label: wide
-mediaQuery: 'only screen and (min-width: 52em)'
-source: toolbar
-sourceType: module
-weight: 2
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint_group.module.toolbar.toolbar.yml b/core/modules/toolbar/config/breakpoint.breakpoint_group.module.toolbar.toolbar.yml
deleted file mode 100644
index 4d09153..0000000
--- a/core/modules/toolbar/config/breakpoint.breakpoint_group.module.toolbar.toolbar.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: module.toolbar.toolbar
-uuid: 03945598-b3ae-4ea7-ad25-375b52f6f0a4
-name: toolbar
-label: toolbar
-breakpoint_ids:
-  - module.toolbar.narrow
-  - module.toolbar.standard
-  - module.toolbar.wide
-source: toolbar
-sourceType: module
-status: true
-langcode: en
diff --git a/core/modules/toolbar/config/schema/toolbar.schema.yml b/core/modules/toolbar/config/schema/toolbar.schema.yml
new file mode 100644
index 0000000..c0949f2
--- /dev/null
+++ b/core/modules/toolbar/config/schema/toolbar.schema.yml
@@ -0,0 +1,25 @@
+# Schema for the configuration files of the toolbar module.
+
+toolbar.settings:
+  type: mapping
+  label: 'Toolbar settings'
+  mapping:
+    breakpoints:
+      type: sequence
+      label: 'Breakpoints'
+      sequence:
+        - type: string
+
+toolbar.breakpoints:
+  type: mapping
+  label: 'Toolbar breakpoint settings'
+  mapping:
+    narrow:
+      type: string
+      label: 'Narrow'
+    standard:
+      type: string
+      label: 'Standard'
+    wide:
+      type: string
+      label: 'Wide'
diff --git a/core/modules/toolbar/config/toolbar.breakpoints.yml b/core/modules/toolbar/config/toolbar.breakpoints.yml
new file mode 100644
index 0000000..74b318e
--- /dev/null
+++ b/core/modules/toolbar/config/toolbar.breakpoints.yml
@@ -0,0 +1,3 @@
+narrow: 'only screen and (min-width: 16.5em)'
+standard: 'only screen and (min-width: 38.125em)'
+wide: 'only screen and (min-width: 52em)'
diff --git a/core/modules/toolbar/config/toolbar.settings.yml b/core/modules/toolbar/config/toolbar.settings.yml
new file mode 100644
index 0000000..1f2de55
--- /dev/null
+++ b/core/modules/toolbar/config/toolbar.settings.yml
@@ -0,0 +1,4 @@
+breakpoints:
+  - module.toolbar.narrow
+  - module.toolbar.standard
+  - module.toolbar.wide
diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module
index 45610c1..85bfafa 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -192,7 +192,7 @@ function toolbar_pre_render($element) {
       function ($object) {
         return $object->mediaQuery;
       },
-      $breakpoints->getBreakpoints()
+      $breakpoints->breakpoints
     );
 
     $element['#attached']['js'][] = array(
diff --git a/core/themes/bartik/config/bartik.breakpoints.yml b/core/themes/bartik/config/bartik.breakpoints.yml
new file mode 100644
index 0000000..501f417
--- /dev/null
+++ b/core/themes/bartik/config/bartik.breakpoints.yml
@@ -0,0 +1,3 @@
+mobile: '(min-width: 0px)'
+narrow: 'all and (min-width: 560px) and (max-width: 850px)'
+wide: 'all and (min-width: 851px)'
diff --git a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml
deleted file mode 100644
index 99740ce..0000000
--- a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.bartik.mobile
-uuid: 676e11ac-c254-415a-881c-28786167ed69
-name: mobile
-label: mobile
-mediaQuery: '(min-width: 0px)'
-source: bartik
-sourceType: theme
-weight: 0
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.narrow.yml b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.narrow.yml
deleted file mode 100644
index 26597ae..0000000
--- a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.narrow.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.bartik.narrow
-uuid: da7ce8eb-f006-4a2f-8557-87ac4f62d5cd
-name: narrow
-label: narrow
-mediaQuery: 'all and (min-width: 560px) and (max-width: 850px)'
-source: bartik
-sourceType: theme
-weight: 1
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.wide.yml b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.wide.yml
deleted file mode 100644
index 90b38db..0000000
--- a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.wide.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.bartik.wide
-uuid: 42288274-fd42-49cc-bb0d-131c13e2b46b
-name: wide
-label: wide
-mediaQuery: 'all and (min-width: 851px)'
-source: bartik
-sourceType: theme
-weight: 2
-multipliers:
-  1x: 1x
-status: true
-langcode: en
diff --git a/core/themes/bartik/config/breakpoint.breakpoint_group.theme.bartik.bartik.yml b/core/themes/bartik/config/breakpoint.breakpoint_group.theme.bartik.bartik.yml
deleted file mode 100644
index 9ae2b82..0000000
--- a/core/themes/bartik/config/breakpoint.breakpoint_group.theme.bartik.bartik.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-id: theme.bartik.bartik
-uuid: 7f6492dc-028c-47e9-bb00-c280cc21586c
-name: bartik
-label: Bartik
-breakpoint_ids:
-  - theme.bartik.mobile
-  - theme.bartik.narrow
-  - theme.bartik.wide
-source: bartik
-sourceType: theme
-status: true
-langcode: en
