diff --git a/default_content.module b/default_content.module
index 0e307ca..9a50bf3 100644
--- a/default_content.module
+++ b/default_content.module
@@ -12,7 +12,7 @@ function default_content_modules_installed($modules) {
   // @todo Move this to an event once we have HookEvent.
   foreach ($modules as $module) {
     if (!\Drupal::isConfigSyncing()) {
-      \Drupal::service('default_content.manager')->importContent($module);
+      \Drupal::service('default_content.manager')->importContentFromModule($module);
     }
   }
 }
diff --git a/src/DefaultContentManager.php b/src/DefaultContentManager.php
index 40acca2..2a24587 100644
--- a/src/DefaultContentManager.php
+++ b/src/DefaultContentManager.php
@@ -5,14 +5,16 @@ namespace Drupal\default_content;
 use Drupal\Component\Graph\Graph;
 use Drupal\Component\Render\FormattableMarkup;
 use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Extension\InfoParserInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\StackMiddleware\Session;
 use Drupal\default_content\Event\DefaultContentEvents;
 use Drupal\default_content\Event\ExportEvent;
-use Drupal\default_content\Event\ImportEvent;
+use Drupal\default_content\Event\ImportFromFolderEvent;
+use Drupal\default_content\Event\ImportFromModuleEvent;
 use Drupal\rest\LinkManager\LinkManagerInterface;
 use Drupal\rest\Plugin\Type\ResourcePluginManager;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -147,89 +149,50 @@ class DefaultContentManager implements DefaultContentManagerInterface {
   /**
    * {@inheritdoc}
    */
-  public function importContent($module) {
+  public function importContent($folder) {
+    foreach ($this->getContentEntityDefinitions() as $entity_type_id => $entity_type) {
+      if (file_exists($folder . '/' . $entity_type_id)) {
+        $this->buildGraph($folder . '/' . $entity_type_id);
+      }
+    }
+    return $this->createEntities();
+  }
+
+  /**
+   * Import default content from given module.
+   *
+   * @param string $module
+   *    Module machine name.
+   *
+   * @return array
+   *    List of created entities.
+   */
+  public function importContentFromModule($module) {
     $created = array();
     $folder = drupal_get_path('module', $module) . "/content";
 
     if (file_exists($folder)) {
-      $file_map = array();
-      foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
-        $reflection = new \ReflectionClass($entity_type->getClass());
-        // We are only interested in importing content entities.
-        if ($reflection->implementsInterface('\Drupal\Core\Config\Entity\ConfigEntityInterface')) {
-          continue;
-        }
-        if (!file_exists($folder . '/' . $entity_type_id)) {
-          continue;
-        }
-        $files = $this->scanner()->scan($folder . '/' . $entity_type_id);
-        // Default content uses drupal.org as domain.
-        // @todo Make this use a uri like default-content:.
-        $this->linkManager->setLinkDomain(static::LINK_DOMAIN);
-        // Parse all of the files and sort them in order of dependency.
-        foreach ($files as $file) {
-          $contents = $this->parseFile($file);
-          // Decode the file contents.
-          $decoded = $this->serializer->decode($contents, 'hal_json');
-          // Get the link to this entity.
-          $item_uuid = $decoded['uuid'][0]['value'];
-
-          // Throw an exception when this UUID already exists.
-          if (isset($file_map[$item_uuid])) {
-            $args = array(
-              '@uuid' => $item_uuid,
-              '@first' => $file_map[$item_uuid]->uri,
-              '@second' => $file->uri,
-            );
-            // Reset link domain.
-            $this->linkManager->setLinkDomain(FALSE);
-            throw new \Exception(new FormattableMarkup('Default content with uuid @uuid exists twice: @first @second', $args));
-          }
-
-          // Store the entity type with the file.
-          $file->entity_type_id = $entity_type_id;
-          // Store the file in the file map.
-          $file_map[$item_uuid] = $file;
-          // Create a vertex for the graph.
-          $vertex = $this->getVertex($item_uuid);
-          $this->graph[$vertex->id]['edges'] = [];
-          if (empty($decoded['_embedded'])) {
-            // No dependencies to resolve.
-            continue;
-          }
-          // Here we need to resolve our dependencies:
-          foreach ($decoded['_embedded'] as $embedded) {
-            foreach ($embedded as $item) {
-              $uuid = $item['uuid'][0]['value'];
-              $edge = $this->getVertex($uuid);
-              $this->graph[$vertex->id]['edges'][$edge->id] = TRUE;
-            }
-          }
-        }
-      }
+      $created = $this->importContent($folder);
+      $this->eventDispatcher->dispatch(DefaultContentEvents::IMPORT_FROM_MODULE, new ImportFromModuleEvent($created, $module));
+    }
+    return $created;
+  }
 
-      // @todo what if no dependencies?
-      $sorted = $this->sortTree($this->graph);
-      foreach ($sorted as $link => $details) {
-        if (!empty($file_map[$link])) {
-          $file = $file_map[$link];
-          $entity_type_id = $file->entity_type_id;
-          $resource = $this->resourcePluginManager->getInstance(array('id' => 'entity:' . $entity_type_id));
-          $definition = $resource->getPluginDefinition();
-          $contents = $this->parseFile($file);
-          $class = $definition['serialization_class'];
-          $entity = $this->serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
-          $entity->enforceIsNew(TRUE);
-          $entity->save();
-          $created[$entity->uuid()] = $entity;
-        }
-      }
-      $this->eventDispatcher->dispatch(DefaultContentEvents::IMPORT, new ImportEvent($created, $module));
+  /**
+   * Import default content from specified folder.
+   *
+   * @param string $folder
+   *    Path to default content folder.
+   *
+   * @return array
+   *    List of created entities.
+   */
+  public function importContentFromFolder($folder) {
+    $created = array();
+    if (file_exists($folder)) {
+      $created = $this->importContent($folder);
+      $this->eventDispatcher->dispatch(DefaultContentEvents::IMPORT_FROM_FOLDER, new ImportFromFolderEvent($created, $folder));
     }
-    // Reset the tree.
-    $this->resetTree();
-    // Reset link domain.
-    $this->linkManager->setLinkDomain(FALSE);
     return $created;
   }
 
@@ -311,6 +274,108 @@ class DefaultContentManager implements DefaultContentManagerInterface {
   }
 
   /**
+   * Build dependency graph and populate file map array.
+   *
+   * @param string $folder
+   *    Default content folder.
+   *
+   * @throws \Exception
+   */
+  protected function buildGraph($folder) {
+    $files = $this->scanner()->scan($folder);
+    // Default content uses drupal.org as domain.
+    // @todo Make this use a uri like default-content:.
+    $this->linkManager->setLinkDomain(static::LINK_DOMAIN);
+    // Parse all of the files and sort them in order of dependency.
+    foreach ($files as $file) {
+      $contents = $this->parseFile($file);
+      // Decode the file contents.
+      $decoded = $this->serializer->decode($contents, 'hal_json');
+      // Get the link to this entity.
+      $self = $decoded['_links']['self']['href'];
+
+      // Throw an exception when this URL already exists.
+      if (isset($this->fileMap[$self])) {
+        $args = array(
+          '@href' => $self,
+          '@first' => $this->fileMap[$self]->uri,
+          '@second' => $file->uri,
+        );
+
+        // Reset link domain.
+        $this->linkManager->setLinkDomain(FALSE);
+        throw new \Exception(new FormattableMarkup('Default content with href @href exists twice: @first @second', $args));
+      }
+
+      preg_match_all('/type\/(.*)\/(.*)/', $decoded['_links']['type']['href'], $matches);
+      $entity_type_id = isset($matches[1][0]) ? $matches[1][0] : NULL;
+      $entity_bundle_id = isset($matches[2][0]) ? $matches[2][0] : NULL;
+
+      // Store the entity type with the file.
+      $file->entity_type_id = $entity_type_id;
+
+      // Store the file in the file map.
+      $this->fileMap[$self] = $file;
+      // Create a vertex for the graph.
+      $vertex = $this->getVertex($self);
+      $this->graph[$vertex->link]['edges'] = [];
+      if (empty($decoded['_embedded'])) {
+        // No dependencies to resolve.
+        continue;
+      }
+      // Here we need to resolve our dependencies;
+      foreach ($decoded['_embedded'] as $embedded) {
+        foreach ($embedded as $item) {
+          $edge = $this->getVertex($item['_links']['self']['href']);
+          $this->graph[$vertex->link]['edges'][$edge->link] = TRUE;
+        }
+      }
+    }
+  }
+
+  /**
+   * Create entities given a pre-populated graph and file map.
+   *
+   * @see DefaultContentManager::buildGraph()
+   *
+   * @return \Drupal\Core\Config\Entity\ConfigEntityInterface[]
+   *    List of created entities.
+   */
+  public function createEntities() {
+    $created = array();
+
+    // @todo what if no dependencies?
+    $sorted = $this->sortTree($this->graph);
+    foreach ($sorted as $link => $details) {
+      if (!empty($this->fileMap[$link])) {
+        $file = $this->fileMap[$link];
+        $entity_type_id = $file->entity_type_id;
+        $resource = $this->resourcePluginManager->getInstance(array('id' => 'entity:' . $entity_type_id));
+        $definition = $resource->getPluginDefinition();
+        $contents = $this->parseFile($file);
+        $class = $definition['serialization_class'];
+        $entity = $this->serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
+        if ($this->entityManager->getStorage($entity_type_id)
+          ->loadByProperties(['uuid' => $entity->uuid()])
+        ) {
+          drupal_set_message(t('node @uuid already exists', ['@uuid' => $entity->uuid()]));
+          continue;
+        }
+        drupal_set_message(t('node @uuid imported', ['@uuid' => $entity->uuid()]));
+        $entity->enforceIsNew(TRUE);
+        $entity->save();
+        $created[$entity->uuid()] = $entity;
+      }
+    }
+
+    // Reset the tree.
+    $this->resetTree();
+    // Reset link domain.
+    $this->linkManager->setLinkDomain(FALSE);
+    return $created;
+  }
+
+  /**
    * Returns all referenced entities of an entity.
    *
    * This method is also recursive to support use-cases like a node -> media
@@ -427,4 +492,21 @@ class DefaultContentManager implements DefaultContentManagerInterface {
     return $this->vertexes[$item_link];
   }
 
+  /**
+   * Get only content entity definitions.
+   *
+   * @return \Drupal\Core\Config\Entity\ConfigEntityInterface[]
+   *    List of content entity definitions.
+   */
+  protected function getContentEntityDefinitions() {
+    $definitions = array();
+    foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
+      $reflection = new \ReflectionClass($entity_type->getClass());
+      if ($reflection->implementsInterface('\Drupal\Core\Entity\ContentEntityInterface')) {
+        $definitions[$entity_type_id] = $entity_type;
+      }
+    }
+    return $definitions;
+  }
+
 }
diff --git a/src/DefaultContentManagerInterface.php b/src/DefaultContentManagerInterface.php
index fdf67a9..f24eb2c 100644
--- a/src/DefaultContentManagerInterface.php
+++ b/src/DefaultContentManagerInterface.php
@@ -18,13 +18,13 @@ interface DefaultContentManagerInterface {
   /**
    * Imports default content for a given module.
    *
-   * @param string $module
-   *   The module to create the default content for.
+   * @param string $folder
+   *   The folder to create the default content from.
    *
    * @return array[\Drupal\Core\Entity\EntityInterface]
    *   The created entities.
    */
-  public function importContent($module);
+  public function importContent($folder);
 
   /**
    * Exports a single entity as importContent expects it.
diff --git a/src/Event/DefaultContentEvents.php b/src/Event/DefaultContentEvents.php
index 1dc78e5..2b0c484 100644
--- a/src/Event/DefaultContentEvents.php
+++ b/src/Event/DefaultContentEvents.php
@@ -5,7 +5,8 @@ namespace Drupal\default_content\Event;
 /**
  * Defines the events for Default Content.
  *
- * @see \Drupal\default_content\Event\ImportEvent
+ * @see \Drupal\default_content\Event\ImportFromModuleEvent
+ * @see \Drupal\default_content\Event\ImportFromFolderEvent
  * @see \Drupal\default_content\Event\ExportEvent
  */
 final class DefaultContentEvents {
@@ -15,15 +16,30 @@ final class DefaultContentEvents {
    *
    * This event allows modules to perform actions after the default content has
    * been imported. The event listener receives a
-   * \Drupal\default_content\Event\ImportEvent instance.
+   * \Drupal\default_content\Event\ImportFromModuleEvent instance.
    *
    * @Event
    *
-   * @see \Drupal\default_content\Event\ImportEvent
+   * @see \Drupal\default_content\Event\ImportFromModuleEvent
    *
    * @var string
    */
-  const IMPORT = 'default_content.import';
+  const IMPORT_FROM_MODULE = 'default_content.import_from_module';
+
+  /**
+   * Name of the event fired when importing default content.
+   *
+   * This event allows modules to perform actions after the default content has
+   * been imported. The event listener receives a
+   * \Drupal\default_content\Event\ImportFromFolderEvent instance.
+   *
+   * @Event
+   *
+   * @see \Drupal\default_content\Event\ImportFromFolderEvent
+   *
+   * @var string
+   */
+  const IMPORT_FROM_FOLDER = 'default_content.import_from_folder';
 
   /**
    * Name of the event fired when exporting default content.
diff --git a/src/Event/ImportEvent.php b/src/Event/ImportFromFolderEvent.php
similarity index 55%
copy from src/Event/ImportEvent.php
copy to src/Event/ImportFromFolderEvent.php
index 0b486f4..b84a192 100644
--- a/src/Event/ImportEvent.php
+++ b/src/Event/ImportFromFolderEvent.php
@@ -1,15 +1,15 @@
 <?php
 
+/**
+ * @file
+ * \Drupal\default_content\Event\ImportFromFolderEvent
+ */
+
 namespace Drupal\default_content\Event;
 
 use Symfony\Component\EventDispatcher\Event;
 
-/**
- * Defines event fired when content is imported.
- *
- * @see \Drupal\default_content\Event\DefaultContentEvents
- */
-class ImportEvent extends Event {
+class ImportFromFolderEvent extends Event {
 
   /**
    * An array of content entities that were imported.
@@ -18,44 +18,42 @@ class ImportEvent extends Event {
    */
   protected $entities;
 
-  /**
-   * The module that provides the default content.
+  /*** The folder that provided the default content.
    *
    * @var string
    */
-  protected $module;
+  protected $folder;
 
   /**
    * Constructs a new import event.
    *
    * @param \Drupal\Core\Entity\ContentEntityInterface[] $entities
    *   An array of content entities that were imported.
-   * @param string $module
-   *   The module that provided the default content.
+   * @param string $folder
+   *   The folder that provided the default content.
    */
-  public function __construct(array $entities, $module) {
+  public function __construct(array $entities, $folder) {
     $this->entities = $entities;
-    $this->module = $module;
+    $this->folder = $folder;
   }
 
   /**
    * Get the imported entities.
    *
    * @return \Drupal\Core\Entity\ContentEntityInterface[]
-   *   An array of content entities that were imported.
    */
   public function getImportedEntities() {
     return $this->entities;
   }
 
   /**
-   * Gets the module name.
+   * Get default content folder.
    *
    * @return string
-   *   The module name that provided the default content.
+   *   The folder that provided the default content.
    */
-  public function getModule() {
-    return $this->module;
+  public function getFolder() {
+    return $this->folder;
   }
 
 }
diff --git a/src/Event/ImportEvent.php b/src/Event/ImportFromModuleEvent.php
similarity index 96%
rename from src/Event/ImportEvent.php
rename to src/Event/ImportFromModuleEvent.php
index 0b486f4..796aa0f 100644
--- a/src/Event/ImportEvent.php
+++ b/src/Event/ImportFromModuleEvent.php
@@ -9,7 +9,7 @@ use Symfony\Component\EventDispatcher\Event;
  *
  * @see \Drupal\default_content\Event\DefaultContentEvents
  */
-class ImportEvent extends Event {
+class ImportFromModuleEvent extends Event {
 
   /**
    * An array of content entities that were imported.
diff --git a/tests/src/Functional/DefaultContentTest.php b/tests/src/Functional/DefaultContentTest.php
index caeaf15..0335604 100644
--- a/tests/src/Functional/DefaultContentTest.php
+++ b/tests/src/Functional/DefaultContentTest.php
@@ -32,18 +32,53 @@ class DefaultContentTest extends BrowserTestBase {
   }
 
   /**
-   * Test importing default content.
+   * Test importing default content from module.
    */
-  public function testImport() {
+  public function testImportFromModule() {
     // Login as admin.
-    $this->drupalLogin($this->drupalCreateUser(array_keys(\Drupal::moduleHandler()->invokeAll(('permission')))));
+    $this->drupalLogin($this->drupalCreateUser(array_keys(\Drupal::moduleHandler()
+      ->invokeAll(('permission')))));
     // Enable the module and import the content.
-    \Drupal::service('module_installer')->install(array('default_content_test'), TRUE);
+    \Drupal::service('module_installer')
+      ->install(array('default_content_test'), TRUE);
+
+    $this->rebuildContainer();
+    $this->assertImportedNodes();
+  }
+
+  /**
+   * Test importing default content from folder.
+   */
+  public function testImportFromFolder() {
+    // Login as admin.
+    $this->drupalLogin($this->drupalCreateUser(array_keys(\Drupal::moduleHandler()
+      ->invokeAll(('permission')))));
+    // Enable configuration test module.
+    \Drupal::service('module_installer')
+      ->install(array('default_content_test'), TRUE);
+
+    // Import content from a specific folder.
+    $folder = drupal_get_path('module', 'default_content_import_test') . '/content';
+    \Drupal::service('default_content.manager')
+      ->importContentFromFolder($folder);
+
     $this->rebuildContainer();
-    $node = $this->getNodeByTitle('Imported node');
-    $this->assertEquals($node->body->value, 'Crikey it works!');
-    $this->assertEquals($node->getType(), 'page');
-    $terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadMultiple();
+    $this->assertImportedNodes();
+  }
+
+  /**
+   * Assert that imported nodes have been created correctly.
+   *
+   * @see DefaultContentTest::testImportFromModule()
+   * @see DefaultContentTest::testImportFromFolder()
+   */
+  protected function assertImportedNodes() {
+    $node = $this->drupalGetNodeByTitle('Imported node');
+    $this->assertEqual($node->body->value, 'Crikey it works!');
+    $this->assertEqual($node->getType(), 'page');
+    $terms = \Drupal::entityTypeManager()
+      ->getStorage('taxonomy_term')
+      ->loadMultiple();
     $term = reset($terms);
     $this->assertTrue(!empty($term));
     $this->assertEquals($term->name->value, 'A tag');
