diff --git a/src/FeaturesAssigner.php b/src/FeaturesAssigner.php
index 45ad5ab..b7d02c2 100644
--- a/src/FeaturesAssigner.php
+++ b/src/FeaturesAssigner.php
@@ -9,9 +9,11 @@ namespace Drupal\features;
 
 use Drupal\Component\Plugin\PluginManagerInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Config\ExtensionInstallStorage;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\features\Entity\FeaturesBundle;
 
 /**
  * Class responsible for performing package assignment.
@@ -48,6 +50,13 @@ class FeaturesAssigner implements FeaturesAssignerInterface {
   protected $configStorage;
 
   /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
    * Local cache for package assignment method instances.
    *
    * @var array
@@ -244,7 +253,7 @@ class FeaturesAssigner implements FeaturesAssignerInterface {
   public function getBundleList() {
     if (empty($this->bundles)) {
       $this->bundles = array();
-      foreach (\Drupal::entityTypeManager()->getStorage('features_bundle')->loadMultiple() as $machine_name => $bundle) {
+      foreach ($this->entityManager->getStorage('features_bundle')->loadMultiple() as $machine_name => $bundle) {
         $this->bundles[$machine_name] = $bundle;
       }
     }
@@ -273,7 +282,18 @@ class FeaturesAssigner implements FeaturesAssignerInterface {
    */
   public function createBundleFromDefault($machine_name, $name = NULL, $description = NULL, $is_profile = FALSE, $profile_name = NULL) {
     // Duplicate the default bundle to get its default configuration.
-    $bundle = $this->getBundle(FeaturesBundleInterface::DEFAULT_BUNDLE)->createDuplicate();
+    $default = $this->getBundle(FeaturesBundleInterface::DEFAULT_BUNDLE);
+    if (!$default) {
+      // If we don't have the default installed, generate it from the install
+      // config file.
+      $ext_storage = new ExtensionInstallStorage($this->configStorage);
+      $record = $ext_storage->read('features.bundle.default');
+      $bundle_storage = $this->entityManager->getStorage('features_bundle');
+      $default = $bundle_storage->createFromStorageRecord($record);
+    }
+
+    /** @var \Drupal\features\Entity\FeaturesBundle $bundle */
+    $bundle = $default->createDuplicate();
 
     $bundle->setMachineName($machine_name);
     $bundle->setName($name);
diff --git a/src/Plugin/FeaturesAssignment/FeaturesAssignmentForwardDependency.php b/src/Plugin/FeaturesAssignment/FeaturesAssignmentForwardDependency.php
new file mode 100644
index 0000000..c90c7ab
--- /dev/null
+++ b/src/Plugin/FeaturesAssignment/FeaturesAssignmentForwardDependency.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\features\Plugin\FeaturesAssignment\FeaturesAssignmentForwardDependency.
+ */
+
+namespace Drupal\features\Plugin\FeaturesAssignment;
+
+use Drupal\Component\Graph\Graph;
+use Drupal\features\FeaturesAssignmentMethodBase;
+
+/**
+ * Class for assigning configuration to packages based on forward dependencies.
+ *
+ * @Plugin(
+ *   id = \Drupal\features\Plugin\FeaturesAssignment\FeaturesAssignmentForwardDependency::METHOD_ID,
+ *   weight = 20,
+ *   name = @Translation("Forward dependency"),
+ *   description = @Translation("Add to packages configuration on which items in the package depend."),
+ * )
+ */
+class FeaturesAssignmentForwardDependency extends FeaturesAssignmentMethodBase {
+
+  /**
+   * The package assignment method id.
+   */
+  const METHOD_ID = 'forward_dependency';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function assignPackages($force = FALSE) {
+    $config_collection = $this->featuresManager->getConfigCollection();
+    $ordered = $this->dependencyOrder($config_collection);
+
+    foreach ($ordered as $name) {
+      $item = $config_collection[$name];
+      if ($item->getPackage()) {
+        // Already has a package, not our business.
+        continue;
+      }
+
+      // Find packages of dependent items.
+      $dependent_packages = [];
+      foreach ($item->getDependents() as $dependent) {
+        if (isset($config_collection[$dependent])) {
+          if ($package = $config_collection[$dependent]->getPackage()) {
+            $dependent_packages[$package] = $package;
+          }
+        }
+      }
+
+      // If zero or multiple packages, we don't know what to do.
+      if (count($dependent_packages) == 1) {
+        $package = key($dependent_packages);
+        $this->featuresManager->assignConfigPackage($package, [$name]);
+      }
+    }
+  }
+
+  /**
+   * Get config items such that each item comes before anything it depends on.
+   *
+   * @param \Drupal\features\ConfigurationItem[] $config_collection
+   *   A collection of configuration items.
+   *
+   * @return string[]
+   *   The names of configuration items, in dependency order.
+   */
+  protected function dependencyOrder($config_collection) {
+    // Populate a graph.
+    $graph = [];
+    foreach ($config_collection as $config) {
+      $graph[$config->getName()] = [];
+      foreach ($config->getDependents() as $dependent) {
+        $graph[$config->getName()]['edges'][$dependent] = 1;
+      }
+    }
+    $graph_object = new Graph($graph);
+    $graph = $graph_object->searchAndSort();
+
+    // Order by inverse weight.
+    $weights = array_column($graph, 'weight');
+    array_multisort($weights, SORT_DESC, $graph);
+    return array_keys($graph);
+  }
+
+}
diff --git a/tests/modules/test_feature/config/install/system.cron.yml b/tests/modules/test_feature/config/install/system.cron.yml
new file mode 100644
index 0000000..e6f30d3
--- /dev/null
+++ b/tests/modules/test_feature/config/install/system.cron.yml
@@ -0,0 +1,3 @@
+threshold:
+  requirements_warning: 172800
+  requirements_error: 1209600
diff --git a/tests/modules/test_feature/test_feature.features.yml b/tests/modules/test_feature/test_feature.features.yml
new file mode 100644
index 0000000..c6cd649
--- /dev/null
+++ b/tests/modules/test_feature/test_feature.features.yml
@@ -0,0 +1,3 @@
+bundle: test
+required:
+  - system.cron
diff --git a/tests/modules/test_feature/test_feature.info.yml b/tests/modules/test_feature/test_feature.info.yml
new file mode 100644
index 0000000..f707b20
--- /dev/null
+++ b/tests/modules/test_feature/test_feature.info.yml
@@ -0,0 +1,7 @@
+name: feature
+type: module
+core: 8.x
+package: Test
+# Force this to install after features.
+dependencies:
+  - features
diff --git a/tests/src/Kernel/FeaturesAssignerTest.php b/tests/src/Kernel/FeaturesAssignerTest.php
new file mode 100644
index 0000000..6bf9f03
--- /dev/null
+++ b/tests/src/Kernel/FeaturesAssignerTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Drupal\Tests\features\Kernel;
+
+use Drupal\Core\Config\StorageInterface;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\features\FeaturesBundleInterface;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * @group features
+ */
+class FeaturesAssignerTest extends KernelTestBase {
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system', 'config'];
+
+  protected $strictConfigSchema = FALSE;
+
+  /**
+   * Test bundle auto-creation during config import.
+   *
+   * We check the case where the import also causes features to be installed,
+   * so at the time auto-creation happens there's not yet a default bundle.
+   */
+  public function testBundleAutoCreationImport() {
+    // Install the feature.
+    $installer = $this->container->get('module_installer');
+    // Have to do these separately so features_modules_installed() doesn't
+    // just exit.
+    $installer->install(['features']);
+    $installer->install(['test_feature']);
+
+    // Save config.
+    $this->copyConfig(
+      $this->container->get('config.storage'),
+      $this->container->get('config.storage.sync')
+    );
+
+    // Uninstall modules.
+    $installer->uninstall(['features', 'test_feature']);
+
+    // Restore the config from after install..
+    $this->configImporter()->import();
+
+    // Find the auto-created bundle.
+    $bundle_storage = $this->container->get('entity_type.manager')
+      ->getStorage('features_bundle');
+    $bundle = $bundle_storage->load('test');
+    $this->assertNotNull($bundle, "Features bundle doesn't exist");
+    $this->assertContains(
+      'Auto-generated bundle',
+      $bundle->getDescription(),
+      "Features bundle not auto-created");
+  }
+
+}
