diff --git a/drush/features.drush.inc b/drush/features.drush.inc
index 71eb2b3..d913ce5 100644
--- a/drush/features.drush.inc
+++ b/drush/features.drush.inc
@@ -613,8 +613,9 @@ function drush_features_import() {
             }
             else {
               // Revert existing component.
+              /** @var \Drupal\features\ConfigurationItem $item */
               $item = $config[$component];
-              $config_revert->revert($item['type'], $item['name_short']);
+              $config_revert->revert($item->getType(), $item->getShortName());
               drush_log(dt('Reverted @module : @component.', $dt_args), 'ok');
             }
           }
@@ -688,7 +689,7 @@ function _drush_features_component_list() {
   $manager = \Drupal::service('features.manager');
   $config = $manager->getConfigCollection();
   foreach ($config as $item_name => $item) {
-    $result[$item['type']][$item['name_short']] = $item['label'];
+    $result[$item->getType()][$item->getShortName()] = $item->getLabel();
   }
   return $result;
 }
@@ -855,12 +856,15 @@ function _drush_features_get_component_map() {
   $packages = $manager->getPackages();
 
   foreach ($config as $item_name => $item) {
-    if (!isset($result[$item['type']][$item['name_short']])) {
-      $result[$item['type']][$item['name_short']] = array();
-    }
-    if (!empty($item['package'])) {
-      $package = $packages[$item['package']];
-      $result[$item['type']][$item['name_short']][] = $package['machine_name'];
+    $type = $item->getType();
+    $short_name = $item->getShortName();
+    $name = $item->getName();
+    if (!isset($result[$type][$short_name])) {
+      $result[$type][$short_name] = array();
+    }
+    if (!empty($item->getPackage())) {
+      $package = $packages[$item->getPackage()];
+      $result[$type][$short_name][] = $package['machine_name'];
     }
   }
 
diff --git a/modules/features_ui/src/Controller/FeaturesUIController.php b/modules/features_ui/src/Controller/FeaturesUIController.php
index 3edb00c..4d08d88 100644
--- a/modules/features_ui/src/Controller/FeaturesUIController.php
+++ b/modules/features_ui/src/Controller/FeaturesUIController.php
@@ -88,7 +88,7 @@ class FeaturesUIController implements ContainerInjectionInterface {
     $result = [];
     foreach ($detected as $name) {
       $item = $config_collection[$name];
-      $result[$item['type']][$item['name_short']] = $item['name'];
+      $result[$item->getType()][$item->getShortName()] = $item->getName();
     }
     return new JsonResponse($result);
   }
@@ -114,14 +114,14 @@ class FeaturesUIController implements ContainerInjectionInterface {
     }
 
     foreach ($item_names as $item_name) {
-      if (!empty($config_collection[$item_name]['package'])) {
-        foreach ($config_collection[$item_name]['dependents'] as $dependent_item_name) {
+      if ($config_collection[$item_name]->getPackage()) {
+        foreach ($config_collection[$item_name]->getDependents() as $dependent_item_name) {
           if (isset($config_collection[$dependent_item_name])) {
             $allow = TRUE;
-            if (!$allow_conflicts && !empty($config_collection[$dependent_item_name]['package'])) {
-              if (!empty($packages[$config_collection[$dependent_item_name]['package']])) {
-                $allow = ($packages[$config_collection[$dependent_item_name]['package']]['status'] == FeaturesManagerInterface::STATUS_NO_EXPORT)
-                  || ($config_collection[$item_name]['package'] == $config_collection[$dependent_item_name]['package']);
+            if (!$allow_conflicts && $config_collection[$dependent_item_name]->getPackage()) {
+              if ($packages[$config_collection[$dependent_item_name]->getPackage()]) {
+                $allow = ($packages[$config_collection[$dependent_item_name]->getPackage()]['status'] == FeaturesManagerInterface::STATUS_NO_EXPORT)
+                  || ($config_collection[$item_name]->getPackage() == $config_collection[$dependent_item_name]->getPackage());
               }
             }
             if ($allow) {
diff --git a/modules/features_ui/src/Form/FeaturesDiffForm.php b/modules/features_ui/src/Form/FeaturesDiffForm.php
index 56ef00c..ec70e3c 100644
--- a/modules/features_ui/src/Form/FeaturesDiffForm.php
+++ b/modules/features_ui/src/Form/FeaturesDiffForm.php
@@ -190,7 +190,7 @@ class FeaturesDiffForm extends FormBase {
     foreach ($items as $config_name) {
       if (isset($config[$config_name])) {
         $item = $config[$config_name];
-        $this->configRevert->revert($item['type'], $item['name_short']);
+        $this->configRevert->revert($item->getType(), $item->getShortName());
       }
       else {
         $item = $this->featuresManager->getConfigType($config_name);
diff --git a/modules/features_ui/src/Form/FeaturesEditForm.php b/modules/features_ui/src/Form/FeaturesEditForm.php
index 0a113bf..704631e 100644
--- a/modules/features_ui/src/Form/FeaturesEditForm.php
+++ b/modules/features_ui/src/Form/FeaturesEditForm.php
@@ -518,14 +518,14 @@ class FeaturesEditForm extends FormBase {
     $components = array();
     $this->conflicts = array();
     foreach ($config as $item_name => $item) {
-      if (!empty($item['package']) && ($item['package'] != $package_name) &&
-        !empty($packages[$item['package']]) && ($packages[$item['package']]['status'] != FeaturesManagerInterface::STATUS_NO_EXPORT)) {
-        $this->conflicts[$item['type']][$item['name_short']] = $item;
+      if (($item->getPackage() != $package_name) &&
+        !empty($packages[$item->getPackage()]) && ($packages[$item->getPackage()]['status'] != FeaturesManagerInterface::STATUS_NO_EXPORT)) {
+        $this->conflicts[$item->getType()][$item->getShortName()] = $item->getLabel();
       }
       if ($this->allowConflicts
-        || !isset($this->conflicts[$item['type']][$item['name_short']])
+        || !isset($this->conflicts[$item->getType()][$item->getShortName()])
         || (!empty($this->package['config_orig']) && in_array($item_name, $this->package['config_orig']))) {
-        $components[$item['type']][$item['name_short']] = $item;
+        $components[$item->getType()][$item->getShortName()] = $item->getLabel();
       }
     }
 
@@ -536,7 +536,7 @@ class FeaturesEditForm extends FormBase {
         $item = $config[$item_name];
         // Remove any conflicts if those are not being allowed.
         // if ($this->allowConflicts || !isset($this->conflicts[$item['type']][$item['name_short']])) {
-        $exported_features_info[$item['type']][$item['name_short']] = $item;
+        $exported_features_info[$item->getType()][$item->getShortName()] = $item->getLabel();
         // }
       }
     }
@@ -548,7 +548,7 @@ class FeaturesEditForm extends FormBase {
       $info = !empty($this->package['info']['features'][$constraint]) ? $this->package['info']['features'][$constraint] : array();
       foreach ($info as $item_name) {
         $item = $config[$item_name];
-        $this->{$constraint}[$item['type']][$item['name_short']] = $item;
+        $this->{$constraint}[$item->getType()][$item->getShortName()] = $item->getLabel();
       }
     }
 
@@ -556,7 +556,7 @@ class FeaturesEditForm extends FormBase {
     $new_features_info = array();
     foreach ($this->package['config'] as $item_name) {
       $item = $config[$item_name];
-      $new_features_info[$item['type']][$item['name_short']] = $item;
+      $new_features_info[$item->getType()][$item->getShortName()] = $item->getLabel();
     }
     $new_features_info['dependencies'] = !empty($this->package['dependencies']) ? $this->package['dependencies'] : array();
 
@@ -616,13 +616,13 @@ class FeaturesEditForm extends FormBase {
         $exported_components = !empty($exported_features_info[$component]) ? $exported_features_info[$component] : array();
         $new_components = !empty($new_features_info[$component]) ? $new_features_info[$component] : array();
 
-        foreach ($component_info as $key => $value) {
+        foreach ($component_info as $key => $label) {
           $config_name = $this->featuresManager->getFullName($component, $key);
           // If checkbox in Sources is checked, move it to Added section.
           if (!$form_state->isValueEmpty(array($component, 'sources', 'selected', $key))) {
             $form_state->setValue(array($component, 'sources', 'selected', $key), FALSE);
             $form_state->setValue(array($component, 'added', $key), 1);
-            $component_export['options']['added'][$key] = $this->configLabel($component, $key, $value['label']);
+            $component_export['options']['added'][$key] = $this->configLabel($component, $key, $label);
             $component_export['selected']['added'][$key] = $key;
             // If this was previously excluded, we don't need to set it as
             // required because it was automatically assigned.
@@ -690,7 +690,7 @@ class FeaturesEditForm extends FormBase {
                 $default_value = FALSE;
               }
             }
-            $component_export['options'][$section][$key] = $this->configLabel($component, $key, $value['label']);
+            $component_export['options'][$section][$key] = $this->configLabel($component, $key, $label);
             $component_export['selected'][$section][$key] = $default_value;
             // Save which dependencies are specifically excluded from
             // auto-detection.
@@ -728,7 +728,7 @@ class FeaturesEditForm extends FormBase {
           elseif (!$form_state->isSubmitted() && isset($exported_components[$key])) {
             // Component is not part of new export, but was in original export.
             // Mark component as Added when creating initial form.
-            $component_export['options']['added'][$key] = $this->configLabel($component, $key, $value['label']);
+            $component_export['options']['added'][$key] = $this->configLabel($component, $key, $label);
             $component_export['selected']['added'][$key] = $key;
           }
           else {
@@ -737,7 +737,7 @@ class FeaturesEditForm extends FormBase {
             foreach (array('included', 'added') as $section) {
               // Restore any user-selected checkboxes.
               if (!$form_state->isValueEmpty(array($component, $section, $key))) {
-                $component_export['options'][$section][$key] = $this->configLabel($component, $key, $value['label']);
+                $component_export['options'][$section][$key] = $this->configLabel($component, $key, $label);
                 $component_export['selected'][$section][$key] = $key;
                 $added = TRUE;
               }
@@ -745,7 +745,7 @@ class FeaturesEditForm extends FormBase {
             if (!$added) {
               // If not Included or Added, then put it back in the unchecked
               // Sources checkboxes.
-              $component_export['options']['sources'][$key] = $this->configLabel($component, $key, $value['label']);
+              $component_export['options']['sources'][$key] = $this->configLabel($component, $key, $label);
               $component_export['selected']['sources'][$key] = FALSE;
             }
           }
diff --git a/modules/features_ui/src/Form/FeaturesExportForm.php b/modules/features_ui/src/Form/FeaturesExportForm.php
index 4f0725f..bc9dc19 100644
--- a/modules/features_ui/src/Form/FeaturesExportForm.php
+++ b/modules/features_ui/src/Form/FeaturesExportForm.php
@@ -328,9 +328,9 @@ class FeaturesExportForm extends FormBase {
     $package_config = array();
     foreach ($package['config'] as $item_name) {
       $item = $config_collection[$item_name];
-      $package_config[$item['type']][] = array(
+      $package_config[$item->getType()][] = array(
         'name' => SafeMarkup::checkPlain($item_name),
-        'label' => SafeMarkup::checkPlain($item['label']),
+        'label' => SafeMarkup::checkPlain($item->getLabel()),
         'class' => in_array($item_name, $overrides) ? 'features-override' :
           (in_array($item_name, $new_config) ? 'features-detected' : ''),
       );
@@ -349,9 +349,9 @@ class FeaturesExportForm extends FormBase {
         elseif (!in_array($item_name, $package['config'])) {
           $item = $config_collection[$item_name];
           $conflicts[] = $item_name;
-          $package_config[$item['type']][] = array(
+          $package_config[$item->getType()][] = array(
             'name' => SafeMarkup::checkPlain($item_name),
-            'label' => SafeMarkup::checkPlain($item['label']),
+            'label' => SafeMarkup::checkPlain($item->getLabel()),
             'class' => 'features-conflict',
           );
         }
@@ -463,7 +463,7 @@ class FeaturesExportForm extends FormBase {
    *
    * @param array $packages
    *   An array of package names.
-   * @param array $config_collection
+   * @param \Drupal\features\ConfigurationItem[] $config_collection
    *   A collection of configuration.
    */
   protected function addUnpackaged(array &$packages, array $config_collection) {
@@ -476,7 +476,7 @@ class FeaturesExportForm extends FormBase {
       'version' => '',
     );
     foreach ($config_collection as $item_name => $item) {
-      if (empty($item['package']) && !$item['extension_provided']) {
+      if (!$item->getPackage() && !$item->isExtensionProvided()) {
         $packages['unpackaged']['config'][] = $item_name;
       }
     }
diff --git a/src/FeaturesAssignmentMethodBase.php b/src/FeaturesAssignmentMethodBase.php
index 3f8e999..6a3e231 100644
--- a/src/FeaturesAssignmentMethodBase.php
+++ b/src/FeaturesAssignmentMethodBase.php
@@ -95,7 +95,7 @@ abstract class FeaturesAssignmentMethodBase implements FeaturesAssignmentMethodI
 
     foreach ($config_collection as $item_name => $item) {
       // Don't assign configuration that's provided by an extension.
-      if (in_array($item['type'], $types) && !($item['extension_provided'])) {
+      if (in_array($item->getType(), $types) && !($item->isExtensionProvided())) {
         try {
           $this->featuresManager->assignConfigPackage($machine_name, [$item_name]);
         }
@@ -122,8 +122,8 @@ abstract class FeaturesAssignmentMethodBase implements FeaturesAssignmentMethodI
     $config_collection = $this->featuresManager->getConfigCollection();
 
     foreach ($config_collection as &$item) {
-      if (in_array($item['type'], $types)) {
-        $item['subdirectory'] = $subdirectory;
+      if (in_array($item->getType(), $types)) {
+        $item->setSubdirectory($subdirectory);
       }
     }
     // Clean up the $item pass by reference.
diff --git a/src/FeaturesManager.php b/src/FeaturesManager.php
index ee88c92..6c954cd 100644
--- a/src/FeaturesManager.php
+++ b/src/FeaturesManager.php
@@ -10,6 +10,7 @@ use Drupal;
 use Drupal\Component\Plugin\PluginManagerInterface;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Config\Entity\ConfigEntityTypeInterface;
 use Drupal\features\FeaturesAssignerInterface;
 use Drupal\features\FeaturesBundleInterface;
 use Drupal\features\FeaturesGeneratorInterface;
@@ -491,26 +492,26 @@ class FeaturesManager implements FeaturesManagerInterface {
         // - and the item isn't already in the package.
 
         // Determine if the item is provided by an extension.
-        $extension_provided = ($config_collection[$item_name]['extension_provided'] === TRUE);
-        $already_assigned = !empty($config_collection[$item_name]['package']);
+        $extension_provided = ($config_collection[$item_name]->isExtensionProvided() === TRUE);
+        $already_assigned = !empty($config_collection[$item_name]->getPackage());
         // If this is the profile package, we can reassign extension-provided configuration.
         $assignable = (!$extension_provided || $this->getAssigner()->getBundle($package['bundle'])->isProfilePackage($package['machine_name']));
-        $excluded_from_package = in_array($package_name, $config_collection[$item_name]['package_excluded']);
+        $excluded_from_package = in_array($package_name, $config_collection[$item_name]->getPackageExcluded());
         $already_in_package = in_array($item_name, $package['config']);
         if (($force || (!$already_assigned && $assignable && !$excluded_from_package)) && !$already_in_package) {
           // Add the item to the package's config array.
           $package['config'][] = $item_name;
           // Mark the item as already assigned.
-          $config_collection[$item_name]['package'] = $package_name;
+          $config_collection[$item_name]->setPackage($package_name);
           // For configuration in the InstallStorage::CONFIG_INSTALL_DIRECTORY
           // directory, set any module dependencies of the configuration item
           // as package dependencies.
           // As its name implies, the core-provided
           // InstallStorage::CONFIG_OPTIONAL_DIRECTORY should not create
           // dependencies.
-          if ($config_collection[$item_name]['subdirectory'] === InstallStorage::CONFIG_INSTALL_DIRECTORY && isset($config_collection[$item_name]['data']['dependencies']['module'])) {
+          if ($config_collection[$item_name]->getSubdirectory() === InstallStorage::CONFIG_INSTALL_DIRECTORY && isset($config_collection[$item_name]->getData()['dependencies']['module'])) {
             $dependencies =& $package['dependencies'];
-            $this->mergeUniqueItems($dependencies, $config_collection[$item_name]['data']['dependencies']['module']);
+            $this->mergeUniqueItems($dependencies, $config_collection[$item_name]->getData()['dependencies']['module']);
           }
         }
       }
@@ -543,7 +544,7 @@ class FeaturesManager implements FeaturesManagerInterface {
             }
           }
 
-          if (empty($item['package']) && preg_match('/[_\-.]' . $pattern . '[_\-.]/', '.' . $item['name_short'] . '.')) {
+          if (!$item->getPackage() && preg_match('/[_\-.]' . $pattern . '[_\-.]/', '.' . $item->getShortName() . '.')) {
             try {
               $this->assignConfigPackage($machine_name, [$item_name]);
             }
@@ -565,11 +566,11 @@ class FeaturesManager implements FeaturesManagerInterface {
       $item_names = array_keys($config_collection);
     }
     foreach ($item_names as $item_name) {
-      if (!empty($config_collection[$item_name]['package'])) {
-        foreach ($config_collection[$item_name]['dependents'] as $dependent_item_name) {
-          if (isset($config_collection[$dependent_item_name]) && (!empty($package) || empty($config_collection[$dependent_item_name]['package']))) {
+      if ($config_collection[$item_name]->getPackage()) {
+        foreach ($config_collection[$item_name]->getDependents() as $dependent_item_name) {
+          if (isset($config_collection[$dependent_item_name]) && (!empty($package) || empty($config_collection[$dependent_item_name]->getPackage()))) {
             try {
-              $package_name = !empty($package) ? $package : $config_collection[$item_name]['package'];
+              $package_name = !empty($package) ? $package : $config_collection[$item_name]->getPackage();
               // If a Package is specified, force assign it to the given
               // package.
               $this->assignConfigPackage($package_name, [$dependent_item_name], !empty($package));
@@ -590,20 +591,20 @@ class FeaturesManager implements FeaturesManagerInterface {
     $config_collection = $this->getConfigCollection();
     foreach ($packages as &$package) {
       foreach ($package['config'] as $item_name) {
-        if (!empty($config_collection[$item_name]['data']['dependencies']['config'])) {
-          foreach ($config_collection[$item_name]['data']['dependencies']['config'] as $dependency_name) {
+        if (!empty($config_collection[$item_name]->getData()['dependencies']['config'])) {
+          foreach ($config_collection[$item_name]->getData()['dependencies']['config'] as $dependency_name) {
             if (isset($config_collection[$dependency_name])) {
               // If the required item is assigned to one of the packages, add
               // a dependency on that package.
-              if (!empty($config_collection[$dependency_name]['package']) && array_key_exists($config_collection[$dependency_name]['package'], $packages)) {
-                $dependency_package = $packages[$config_collection[$dependency_name]['package']];
+              if ($config_collection[$dependency_name]->getPackage() && array_key_exists($config_collection[$dependency_name]->getPackage(), $packages)) {
+                $dependency_package = $packages[$config_collection[$dependency_name]->getPackage()];
                 $dependency_bundle = $this->getAssigner()->getBundle($dependency_package['bundle']);
                 $this->mergeUniqueItems($package['dependencies'], [$dependency_bundle->getFullName($dependency_package['machine_name'])]);
               }
               // Otherwise, if the dependency is provided by an existing
               // feature, add a dependency on that feature.
-              elseif (!empty($config_collection[$dependency_name]['providing_feature'])) {
-                $this->mergeUniqueItems($package['dependencies'], [$config_collection[$dependency_name]['providing_feature']]);
+              elseif ($config_collection[$dependency_name]->getProvidingFeature()) {
+                $this->mergeUniqueItems($package['dependencies'], [$config_collection[$dependency_name]->getProvidingFeature()]);
               }
             }
           }
@@ -786,17 +787,21 @@ 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.
-        if ($config['type'] == 'user_role') {
-          $config['data']['permissions'] = [];
+        if ($config->getType() == 'user_role') {
+          $data = $config->getData();
+          $data['permissions'] = [];
+          $config->setData($data);
         }
         $package['files'][$name] = [
-          'filename' => $config['name'] . '.yml',
-          'subdirectory' => $config['subdirectory'],
-          'string' => Yaml::encode($config['data'])
+          'filename' => $config->getName() . '.yml',
+          'subdirectory' => $config->getSubdirectory(),
+          'string' => Yaml::encode($config->getData())
         ];
       }
     }
@@ -948,20 +953,18 @@ class FeaturesManager implements FeaturesManagerInterface {
             }
           }
 
-          $config_collection[$name] = [
-            'name' => $name,
-            'name_short' => $item_name,
+          $config_collection[$name] = (new ConfigurationItem($name, $data, [
+            'shortName' => $item_name,
             'label' => $label,
             'type' => $config_type,
-            'data' => $data,
             'dependents' => 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' => [],
-          ];
+            'extensionProvided' => NULL,
+            'providingFeature' => isset($existing_config[$name]) ? $existing_config[$name] : NULL,
+            'packageExcluded' => [],
+          ]));
         }
       }
       $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/src/Plugin/FeaturesAssignment/FeaturesAssignmentBaseType.php b/src/Plugin/FeaturesAssignment/FeaturesAssignmentBaseType.php
index fa305f5..833cf57 100644
--- a/src/Plugin/FeaturesAssignment/FeaturesAssignmentBaseType.php
+++ b/src/Plugin/FeaturesAssignment/FeaturesAssignmentBaseType.php
@@ -40,15 +40,15 @@ class FeaturesAssignmentBaseType extends FeaturesAssignmentMethodBase {
     $config_collection = $this->featuresManager->getConfigCollection();
 
     foreach ($config_collection as $item_name => $item) {
-      if (in_array($item['type'], $config_base_types)) {
-        if (!isset($packages[$item['name_short']]) && empty($item['package'])) {
-          $description = $this->t('Provide @label @type and related configuration.', array('@label' => $item['label'], '@type' => Unicode::strtolower($config_types[$item['type']])));
-          if (isset($item['data']['description'])) {
-            $description .= ' ' . $item['data']['description'];
+      if (in_array($item->getType(), $config_base_types)) {
+        if (!isset($packages[$item->getShortName()]) && !$item->getPackage()) {
+          $description = $this->t('Provide @label @type and related configuration.', array('@label' => $item->getLabel(), '@type' => Unicode::strtolower($config_types[$item->getType()])));
+          if (isset($item->getData()['description'])) {
+            $description .= ' ' . $item->getData()['description'];
           }
-          $this->featuresManager->initPackage($item['name_short'], $item['label'], $description, 'module', $current_bundle);
+          $this->featuresManager->initPackage($item->getShortName(), $item->getLabel(), $description, 'module', $current_bundle);
           try {
-            $this->featuresManager->assignConfigPackage($item['name_short'], [$item_name]);
+            $this->featuresManager->assignConfigPackage($item->getShortName(), [$item_name]);
           }
           catch (\Exception $exception) {
             \Drupal::logger('features')->error($exception->getMessage());
diff --git a/src/Plugin/FeaturesAssignment/FeaturesAssignmentExclude.php b/src/Plugin/FeaturesAssignment/FeaturesAssignmentExclude.php
index 999cd1a..f5b880a 100644
--- a/src/Plugin/FeaturesAssignment/FeaturesAssignmentExclude.php
+++ b/src/Plugin/FeaturesAssignment/FeaturesAssignmentExclude.php
@@ -42,7 +42,7 @@ class FeaturesAssignmentExclude extends FeaturesAssignmentMethodBase {
     $exclude_types = $settings['types']['config'];
     if (!empty($exclude_types)) {
       foreach ($config_collection as $item_name => $item) {
-        if (in_array($item['type'], $exclude_types)) {
+        if (in_array($item->getType(), $exclude_types)) {
           unset($config_collection[$item_name]);
         }
       }
@@ -95,7 +95,7 @@ class FeaturesAssignmentExclude extends FeaturesAssignmentMethodBase {
         if (isset($config_collection[$item_name])) {
           // Flag extension-provided configuration, which should not be added
           // to regular features but can be added to an install profile.
-          $config_collection[$item_name]['extension_provided'] = TRUE;
+          $config_collection[$item_name]->setExtensionProvided(TRUE);
         }
       }
     }
diff --git a/src/Plugin/FeaturesAssignment/FeaturesAssignmentPackages.php b/src/Plugin/FeaturesAssignment/FeaturesAssignmentPackages.php
index 4e71ca1..361ad17 100644
--- a/src/Plugin/FeaturesAssignment/FeaturesAssignmentPackages.php
+++ b/src/Plugin/FeaturesAssignment/FeaturesAssignmentPackages.php
@@ -44,7 +44,9 @@ class FeaturesAssignmentPackages extends FeaturesAssignmentMethodBase {
           $config_collection = $this->featuresManager->getConfigCollection();
           foreach ($info['features']['excluded'] as $config_name) {
             if (isset($config_collection[$config_name])) {
-              $config_collection[$config_name]['package_excluded'][] = $short_name;
+              $package_excluded = $config_collection[$config_name]->getPackageExcluded();
+              $package_excluded[] = $short_name;
+              $config_collection[$config_name]->setPackageExcluded($package_excluded);
             }
           }
           $this->featuresManager->setConfigCollection($config_collection);
diff --git a/src/Plugin/FeaturesAssignment/FeaturesAssignmentProfile.php b/src/Plugin/FeaturesAssignment/FeaturesAssignmentProfile.php
index f72f14f..d2c1693 100644
--- a/src/Plugin/FeaturesAssignment/FeaturesAssignmentProfile.php
+++ b/src/Plugin/FeaturesAssignment/FeaturesAssignmentProfile.php
@@ -89,7 +89,7 @@ class FeaturesAssignmentProfile extends FeaturesAssignmentMethodBase {
             if (isset($config_collection[$item_name])) {
               // Only assign it if it's not already assigned to a package.
               // @todo: if it's provided by a module, add a dependency.
-              if (empty($config_collection[$item_name]['package'])) {
+              if (!$config_collection[$item_name]->getPackage()) {
                 $this->featuresManager->assignConfigPackage($profile_name, [$item_name], $force);
                 // Reload the profile to refresh the config array after the addition.
                 $profile_package = $this->featuresManager->getPackage($profile_name);
@@ -97,7 +97,7 @@ class FeaturesAssignmentProfile extends FeaturesAssignmentMethodBase {
               // If it's already assigned to a package in the current bundle,
               // add a dependency.
               else {
-                $machine_name = $current_bundle->getFullName($config_collection[$item_name]['package']);
+                $machine_name = $current_bundle->getFullName($config_collection[$item_name]->getPackage());
                 if (!in_array($machine_name, $profile_package['dependencies'])) {
                   $profile_package['dependencies'][] = $machine_name;
                 }
diff --git a/tests/src/Unit/FeaturesManagerTest.php b/tests/src/Unit/FeaturesManagerTest.php
index 3d418c0..c146870 100644
--- a/tests/src/Unit/FeaturesManagerTest.php
+++ b/tests/src/Unit/FeaturesManagerTest.php
@@ -7,11 +7,15 @@
 
 namespace Drupal\Tests\features\Unit;
 
+use Drupal\Core\Config\Entity\ConfigEntityType;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Entity\EntityType;
 use Drupal\features\FeaturesAssignerInterface;
-use Drupal\features\FeaturesBundle;
 use Drupal\features\FeaturesBundleInterface;
+use Drupal\features\ConfigurationItem;
 use Drupal\features\FeaturesManager;
 use Drupal\features\FeaturesManagerInterface;
+use Drupal\migrate\Plugin\migrate\destination\Config;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -26,22 +30,35 @@ class FeaturesManagerTest extends UnitTestCase {
   protected $featuresManager;
 
   /**
+   * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $entityManager;
+
+  /**
    * {@inheritdoc}
    */
   public function setUp() {
+    parent::setUp();
+
     $entity_type = $this->getMock('\Drupal\Core\Config\Entity\ConfigEntityTypeInterface');
     $entity_type->expects($this->any())
       ->method('getConfigPrefix')
       ->willReturn('custom');
-    $entity_manager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface');
-    $entity_manager->expects($this->any())
+    $this->entityManager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface');
+    $this->entityManager->expects($this->any())
       ->method('getDefinition')
       ->willReturn($entity_type);
     $config_factory = $this->getMock('\Drupal\Core\Config\ConfigFactoryInterface');
     $storage = $this->getMock('Drupal\Core\Config\StorageInterface');
     $config_manager = $this->getMock('Drupal\Core\Config\ConfigManagerInterface');
     $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
-    $this->featuresManager = new FeaturesManager($entity_manager, $config_factory, $storage, $config_manager, $module_handler);
+    $this->featuresManager = new FeaturesManager($this->entityManager, $config_factory, $storage, $config_manager, $module_handler);
+
+    $string_translation = $this->getStringTranslationStub();
+    $container = new ContainerBuilder();
+    $container->set('string_translation', $string_translation);
+    $container->set('app.root', $this->root);
+    \Drupal::setContainer($container);
   }
 
   /**
@@ -98,7 +115,7 @@ class FeaturesManagerTest extends UnitTestCase {
    * @covers ::getConfigCollection
    */
   public function testConfigCollection() {
-    $config = ['config' => 'collection'];
+    $config = ['config' => new ConfigurationItem('', [])];
     $this->featuresManager->setConfigCollection($config);
     $this->assertArrayEquals($config, $this->featuresManager->getConfigCollection());
   }
@@ -112,34 +129,23 @@ class FeaturesManagerTest extends UnitTestCase {
 
   protected function getAssignInterPackageDependenciesConfigCollection() {
     $config_collection = [];
-    $config_collection['example.config'] = [
-      'name' => 'example.config',
-      'data' => [
-        'dependencies' => [
-          'config' => [
-            'example.config2',
-            'example.config3',
-          ],
+    $config_collection['example.config'] = (new ConfigurationItem('example.config', [
+      'dependencies' => [
+        'config' => [
+          'example.config2',
+          'example.config3',
         ],
       ],
-      'package' => 'package',
-    ];
-    $config_collection['example.config2'] = [
-      'name' => 'example.config2',
-      'data' => [
-        'dependencies' => [],
-      ],
-      'package' => 'package2',
-      'providing_feature' => 'my_feature',
-    ];
-    $config_collection['example.config3'] = [
-      'name' => 'example.config3',
-      'data' => [
-        'dependencies' => [],
-      ],
-      'package' => '',
-      'providing_feature' => 'my_other_feature',
-    ];
+    ]))->setPackage('package');
+    $config_collection['example.config2'] =  (new ConfigurationItem('example.config2', [
+      'dependencies' => [],
+    ]))
+      ->setPackage('package2')
+      ->setProvidingFeature('my_feature');
+    $config_collection['example.config3'] = (new ConfigurationItem('example.config3', [
+      'dependencies' => [],
+    ]))
+      ->setProvidingFeature('my_other_feature');
     return $config_collection;
   }
 
