diff --git a/src/ConfigurationItem.php b/src/ConfigurationItem.php
new file mode 100644
index 0000000..a9b4bda
--- /dev/null
+++ b/src/ConfigurationItem.php
@@ -0,0 +1,391 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\features\ConfigurationItem.
+ */
+
+namespace Drupal\features;
+
+/**
+ * Contains some configuration together with metadata like the name + package.
+ *
+ * @todo Should the object be immutable?
+ */
+class ConfigurationItem implements \ArrayAccess {
+
+  /**
+   * Prefixed configuration item name.
+   *
+   * @var string
+   */
+  protected $name;
+
+  /**
+   * Configuration item name without prefix.
+   *
+   * @var string
+   */
+  protected $shortName;
+
+  /**
+   * Human readable name of configuration item.
+   *
+   * @var string
+   */
+  protected $label;
+
+  /**
+   * Type of configuration.
+   *
+   * @var string
+   */
+  protected $type;
+
+  /**
+   * The contents of the configuration item in exported format.
+   *
+   * @var array
+   */
+  protected $data;
+
+  /**
+   * Array of names of dependent configuration items.
+   *
+   * @var string[]
+   */
+  protected $dependents = [];
+
+  /**
+   * Feature subdirectory to export item to.
+   *
+   * @var string
+   */
+  protected $subdirectory;
+
+  /**
+   * Machine name of a package the configuration is assigned to.
+   *
+   * @var string
+   */
+  protected $package;
+
+  /**
+   * Whether the configuration is provided by an extension.
+   *
+   * @var bool
+   */
+  protected $extensionProvided = FALSE;
+
+  /**
+   * The providing feature.
+   *
+   * @var string
+   */
+  protected $providingFeature;
+
+  /**
+   * Array of package names that this item should be excluded from.
+   *
+   * @var string[]
+   */
+  protected $packageExcluded = [];
+
+  /**
+   * Creates a new ConfigurationItem instance.
+   *
+   * @param string $name
+   * @param string $shortName
+   * @param string $label
+   * @param string $type
+   * @param array $data
+   * @param \string[] $dependents
+   * @param string $subdirectory
+   * @param string $package
+   * @param bool $extensionProvided
+   * @param string $providingFeature
+   * @param \string[] $packageExcluded
+   */
+  public function __construct($name, $shortName, $label, $type, array $data, array $dependents, $subdirectory, $package, $extensionProvided, $providingFeature, array $packageExcluded) {
+    $this->name = $name;
+    $this->shortName = $shortName;
+    $this->label = $label;
+    $this->type = $type;
+    $this->data = $data;
+    $this->dependents = $dependents;
+    $this->subdirectory = $subdirectory;
+    $this->package = $package;
+    $this->extensionProvided = $extensionProvided;
+    $this->providingFeature = $providingFeature;
+    $this->packageExcluded = $packageExcluded;
+  }
+
+  /**
+   * @return mixed
+   */
+  public function getName() {
+    return $this->name;
+  }
+
+  /**
+   * @param mixed $name
+   *
+   * @return ConfigurationItem
+   */
+  public function setName($name) {
+    $this->name = $name;
+    return $this;
+  }
+
+  /**
+   * @return mixed
+   */
+  public function getShortName() {
+    return $this->shortName;
+  }
+
+  /**
+   * @param mixed $shortName
+   *
+   * @return ConfigurationItem
+   */
+  public function setShortName($shortName) {
+    $this->shortName = $shortName;
+    return $this;
+  }
+
+  /**
+   * @return mixed
+   */
+  public function getLabel() {
+    return $this->label;
+  }
+
+  /**
+   * @param mixed $label
+   *
+   * @return ConfigurationItem
+   */
+  public function setLabel($label) {
+    $this->label = $label;
+    return $this;
+  }
+
+  /**
+   * @return mixed
+   */
+  public function getType() {
+    return $this->type;
+  }
+
+  /**
+   * @param mixed $type
+   *
+   * @return ConfigurationItem
+   */
+  public function setType($type) {
+    $this->type = $type;
+    return $this;
+  }
+
+  /**
+   * @return mixed
+   */
+  public function getData() {
+    return $this->data;
+  }
+
+  /**
+   * @param mixed array
+   *
+   * @return ConfigurationItem
+   */
+  public function setData(array $data) {
+    $this->data = $data;
+    return $this;
+  }
+
+  /**
+   * @return string[]
+   */
+  public function getDependents() {
+    return $this->dependents;
+  }
+
+  /**
+   * @param array $dependents
+   *
+   * @return ConfigurationItem
+   */
+  public function setDependents($dependents) {
+    $this->dependents = $dependents;
+    return $this;
+  }
+
+  /**
+   * @return mixed
+   */
+  public function getSubdirectory() {
+    return $this->subdirectory;
+  }
+
+  /**
+   * @param mixed $subdirectory
+   *
+   * @return ConfigurationItem
+   */
+  public function setSubdirectory($subdirectory) {
+    $this->subdirectory = $subdirectory;
+    return $this;
+  }
+
+  /**
+   * @return mixed
+   */
+  public function getPackage() {
+    return $this->package;
+  }
+
+  /**
+   * @param mixed $package
+   *
+   * @return ConfigurationItem
+   */
+  public function setPackage($package) {
+    $this->package = $package;
+    return $this;
+  }
+
+  /**
+   * @return boolean
+   */
+  public function isExtensionProvided() {
+    return $this->extensionProvided;
+  }
+
+  /**
+   * @param boolean $extensionProvided
+   *
+   * @return ConfigurationItem
+   */
+  public function setExtensionProvided($extensionProvided) {
+    $this->extensionProvided = $extensionProvided;
+    return $this;
+  }
+
+  /**
+   * @return string
+   */
+  public function getProvidingFeature() {
+    return $this->providingFeature;
+  }
+
+  /**
+   * @param string $providingFeature
+   */
+  public function setProvidingFeature($providingFeature) {
+    $this->providingFeature = $providingFeature;
+  }
+
+  /**
+   * @return string[]
+   */
+  public function getPackageExcluded() {
+    return $this->packageExcluded;
+  }
+
+  /**
+   * @param array $packageExcluded
+   *
+   * @return ConfigurationItem
+   */
+  public function setPackageExcluded($packageExcluded) {
+    $this->packageExcluded = $packageExcluded;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function offsetGet($offset) {
+    switch ($offset) {
+      case 'name':
+        return $this->getName();
+      case 'name_short':
+        return $this->getShortName();
+      case 'label':
+        return $this->getLabel();
+      case 'type':
+        return $this->getType();
+      case 'data':
+        return $this->getData();
+      case 'dependents':
+        return $this->getDependents();
+      case 'subdirectory':
+        return $this->getSubdirectory();
+      case 'package':
+        return $this->getPackage();
+      case 'extension_provided':
+        return $this->isExtensionProvided();
+      case 'package_excluded':
+        return $this->getPackageExcluded();
+      default:
+        throw new \InvalidArgumentException('Wrong configuration item key: ' . $offset);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function offsetSet($offset, $value) {
+    switch ($offset) {
+      case 'name':
+        return $this->setName($value);
+      case 'name_short':
+        return $this->setShortName($value);
+      case 'label':
+        return $this->setLabel($value);
+      case 'type':
+        return $this->setType($value);
+      case 'data':
+        return $this->setData($value);
+      case 'dependents':
+        return $this->setDependents($value);
+      case 'subdirectory':
+        return $this->setSubdirectory($value);
+      case 'package':
+        return $this->setPackage($value);
+      case 'extension_provided':
+        return $this->setExtensionProvided($value);
+      case 'package_excluded':
+        return $this->setPackageExcluded($value);
+      default:
+        throw new \InvalidArgumentException('Wrong configuration item key: ' . $offset);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function offsetExists($offset) {
+    return in_array($offset, [
+      'name',
+      'name_short',
+      'label',
+      'type',
+      'data',
+      'dependents',
+      'subdirectory',
+      'package',
+      'extension_provided',
+      'package_excluded'
+    ]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function offsetUnset($offset) {
+  }
+
+}
diff --git a/src/FeaturesManager.php b/src/FeaturesManager.php
index 1bb6602..bc772a3 100644
--- a/src/FeaturesManager.php
+++ b/src/FeaturesManager.php
@@ -786,7 +786,9 @@ class FeaturesManager implements FeaturesManagerInterface {
         $config = $config_collection[$name];
         // The UUID is site-specfic, so don't export it.
         if ($entity_type_id = $this->configManager->getEntityTypeIdByName($name)) {
-          unset($config['data']['uuid']);
+          $data = $config->getData();
+          unset($data['uuid']);
+          $config->setData($data);
         }
         // User roles include all permissions currently assigned to them. To
         // avoid extraneous additions, reset permissions.
@@ -948,20 +950,20 @@ class FeaturesManager implements FeaturesManagerInterface {
             }
           }
 
-          $config_collection[$name] = [
-            'name' => $name,
-            'name_short' => $item_name,
-            'label' => $label,
-            'type' => $config_type,
-            'data' => $data,
-            'dependents' => array_keys($dependents),
+          $config_collection[$name] = new ConfigurationItem(
+            $name,
+            $item_name,
+            $label,
+            $config_type,
+            $data,
+            array_keys($dependents),
             // Default to the install directory.
-            'subdirectory' => InstallStorage::CONFIG_INSTALL_DIRECTORY,
-            'package' => '',
-            'extension_provided' => NULL,
-            'providing_feature' => isset($existing_config[$name]) ? $existing_config[$name] : NULL,
-            'package_excluded' => [],
-          ];
+            InstallStorage::CONFIG_INSTALL_DIRECTORY,
+            '',
+            NULL,
+            isset($existing_config[$name]) ? $existing_config[$name] : NULL,
+            []
+          );
         }
       }
       $this->setConfigCollection($config_collection);
diff --git a/src/FeaturesManagerInterface.php b/src/FeaturesManagerInterface.php
index 9737d7a..5adb27f 100644
--- a/src/FeaturesManagerInterface.php
+++ b/src/FeaturesManagerInterface.php
@@ -69,7 +69,7 @@ interface FeaturesManagerInterface {
    * @param bool $reset
    *   If TRUE, recalculate the configuration (undo all assignment methods).
    *
-   * @return array
+   * @return \Drupal\features\ConfigurationItem[]
    *   An array of items, each with the following keys:
    *   - 'name': prefixed configuration item name.
    *   - 'name_short': configuration item name without prefix.
@@ -89,7 +89,7 @@ interface FeaturesManagerInterface {
   /**
    * Sets an array of site configuration.
    *
-   * @param array $config_collection
+   * @param \Drupal\features\ConfigurationItem[] $config_collection
    *   An array of items.
    */
   public function setConfigCollection(array $config_collection);
diff --git a/tests/src/Unit/FeaturesManagerTest.php b/tests/src/Unit/FeaturesManagerTest.php
index ebaacd8..5d05a2b 100644
--- a/tests/src/Unit/FeaturesManagerTest.php
+++ b/tests/src/Unit/FeaturesManagerTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Tests\features\Unit;
 
+use Drupal\features\ConfigurationItem;
 use Drupal\features\FeaturesManager;
 use Drupal\features\FeaturesManagerInterface;
 use Drupal\Tests\UnitTestCase;
@@ -95,7 +96,7 @@ class FeaturesManagerTest extends UnitTestCase {
    * @covers ::getConfigCollection
    */
   public function testConfigCollection() {
-    $config = ['config' => 'collection'];
+    $config = ['config' => new ConfigurationItem('', '', '', '', [], [], '', '', TRUE, '', [])];
     $this->featuresManager->setConfigCollection($config);
     $this->assertArrayEquals($config, $this->featuresManager->getConfigCollection());
   }
