diff --git a/lib/Drupal/configuration/Config/Configuration.php b/lib/Drupal/configuration/Config/Configuration.php
index 0dcab22..ecf2d28 100644
--- a/lib/Drupal/configuration/Config/Configuration.php
+++ b/lib/Drupal/configuration/Config/Configuration.php
@@ -715,78 +715,4 @@ abstract class Configuration {
     print ConfigurationManagement::createTarContent("configuration/{$file_name}", $file_content);
   }
 
-  /**
-   * This function will exectute a callback function over all the configurations
-   * objects that it process.
-   *
-   * @param  ConfigIteratorSettings $settings
-   *   A ConfigIteratorSettings instance that specifies, which is the callback
-   *   to execute. If dependencies and optional configurations should be
-   *   processed too, and storage the cache of already processed configurations.
-   *
-   * @see importToActiveStore()
-   * @see exportToDataStore()
-   * @see revertActiveStore()
-   * @see discoverRequiredModules()
-   */
-  function iterate(ConfigIteratorSettings &$settings) {
-    $callback = $settings->getCallback();
-    $build_callback = $settings->getBuildCallback();
-
-    if ($settings->alreadyProcessed($this)) {
-      return;
-    }
-
-    // First proccess requires the dependencies that have to be processed before
-    // load the current configuration.
-    if ($settings->processDependencies()) {
-      foreach ($this->getDependencies() as $dependency => $config_dependency) {
-
-        // In some callbacks, the dependencies storages the full config object
-        // other simply use a plain string. If the object is available, use
-        // that version.
-        if (is_object($config_dependency)) {
-          $config = $config_dependency;
-        }
-        else {
-          $config = $settings->getFromCache($dependency);
-          if (!$config) {
-            $config = ConfigurationManagement::createConfigurationInstance($dependency);
-          }
-        }
-        $config->{$build_callback}();
-        $config->iterate($settings);
-      }
-    }
-
-    if ($settings->alreadyProcessed($this)) {
-      return;
-    }
-
-    // Now, after proccess the dependencies, proccess the current configuration.
-    $this->{$callback}($settings);
-    $settings->addToCache($this);
-
-    // After proccess the dependencies and the current configuration, proccess
-    // the optionals.
-    if ($settings->processOptionals()) {
-      foreach ($this->getOptionalConfigurations() as $optional => $optional_config) {
-        $config = $settings->getFromCache($optional);
-
-        // In some callbacks, the optionals storages the full config object
-        // other simply use a plain string. If the object is available, use
-        // that version.
-        if (is_object($optional_config)) {
-          $config = $optional_config;
-        }
-        else {
-          if (!$config) {
-            $config = ConfigurationManagement::createConfigurationInstance($optional);
-          }
-        }
-        $config->{$build_callback}();
-        $config->iterate($settings);
-      }
-    }
-  }
 }
diff --git a/lib/Drupal/configuration/Config/ConfigurationManagement.php b/lib/Drupal/configuration/Config/ConfigurationManagement.php
index 72016b7..0d8908b 100644
--- a/lib/Drupal/configuration/Config/ConfigurationManagement.php
+++ b/lib/Drupal/configuration/Config/ConfigurationManagement.php
@@ -318,19 +318,32 @@ class ConfigurationManagement {
         'info' => array(
           'exported' => array(),
           'hash' => array(),
-        )
+        ),
+        'batch_stack' => array(),
       )
     );
 
     foreach ($list as $component) {
       $config = static::createConfigurationInstance($component);
 
-      // Make sure the object is built before start to iterate on its
-      // dependencies.
-      $config->build();
-      $config->iterate($settings);
+      $settings->addToStack($config);
     }
 
+    $operations = array(
+      array(
+        '\Drupal\configuration\Config\ConfigurationManagement::proccessBatchItem',
+        $settings,
+      )
+    )
+
+    $batch = array(
+      'operations' => $operations,
+      'title' => t('Import batch'),
+      'init_message' => t('Initializing'),
+      'error_message' => t('An error occurred'),
+      'finished' => 'mymodule_finished_method'
+    );
+
     if ($start_tracking) {
       static::updateTrackingFile();
     }
@@ -650,4 +663,85 @@ class ConfigurationManagement {
     }
     return $tar;
   }
+
+/**
+   * This function will exectute a callback function over all the configurations
+   * objects that it process.
+   *
+   * @param  ConfigIteratorSettings $settings
+   *   A ConfigIteratorSettings instance that specifies, which is the callback
+   *   to execute. If dependencies and optional configurations should be
+   *   processed too, and storage the cache of already processed configurations.
+   *
+   * @see importToActiveStore()
+   * @see exportToDataStore()
+   * @see revertActiveStore()
+   * @see discoverRequiredModules()
+   */
+  static public function batchProccessItem($current_config, ConfigIteratorSettings &$settings) {
+    $callback = $settings->getCallback();
+    $build_callback = $settings->getBuildCallback();
+    $current_config->{$build_callback}();
+
+    if ($settings->alreadyProcessed($this)) {
+      return;
+    }
+
+    // First add the optionals items to the stack, so they are proccessed after
+    // all the required items where proccessed
+    if ($settings->processOptionals()) {
+      $new_items = FALSE;
+      foreach ($current_config->getOptionalConfigurations() as $optional => $optional_config) {
+        $config = $settings->getFromCache($optional);
+
+        // In some callbacks, the optionals storages the full config object
+        // other simply use a plain string. If the object is available, use
+        // that version.
+        if (is_object($optional_config)) {
+          $config = $optional_config;
+        }
+        else {
+          if (!$config) {
+            $config = ConfigurationManagement::createConfigurationInstance($optional);
+          }
+        }
+        $settings->addToStack($config);
+        $new_dependencies = TRUE;
+      }
+      // If there are new dependencies, stop the executing here, to proccess
+      // the new dependencies before continue.
+      if ($new_dependencies) {
+        return;
+      }
+    }
+
+    // Before proccess the current config, add the optionals configurations
+    // to the stack, but continue with the proccessing.
+    if ($settings->processDependencies()) {
+      foreach ($current_config->getDependencies() as $dependency => $config_dependency) {
+
+        // In some callbacks, the dependencies storages the full config object
+        // other simply use a plain string. If the object is available, use
+        // that version.
+        if (is_object($config_dependency)) {
+          $config = $config_dependency;
+        }
+        else {
+          $config = $settings->getFromCache($dependency);
+          if (!$config) {
+            $config = ConfigurationManagement::createConfigurationInstance($dependency);
+          }
+        }
+        $config->{$build_callback}();
+        $settings->addToStack($config);
+      }
+    }
+
+    // Finally, after adding to the stack the optionals, proccess the current
+    // configuration. This have to be done here, so the main configuration
+    // is proccesed before get objects from the stack and therefore will be
+    // proccessed before the optionals configurations.
+    $current_config->{$callback}($settings);
+    $settings->addToCache($this);
+  }
 }
diff --git a/lib/Drupal/configuration/Utils/ConfigIteratorSettings.php b/lib/Drupal/configuration/Utils/ConfigIteratorSettings.php
index 8ef4ab5..f3cc5c8 100644
--- a/lib/Drupal/configuration/Utils/ConfigIteratorSettings.php
+++ b/lib/Drupal/configuration/Utils/ConfigIteratorSettings.php
@@ -54,6 +54,13 @@ class ConfigIteratorSettings {
    */
   protected $already_processed = array();
 
+  /**
+   * An array of configurations to proccess in a batch job.
+   *
+   * @var array
+   */
+  protected $batch_stack = array();
+
 
   /**
    * An array to storage the useful info obtained after process the $callback
@@ -166,4 +173,12 @@ class ConfigIteratorSettings {
   function resetInfo() {
     $this->info = array();
   }
+
+  function addToBatchStack($config) {
+    $this->batch_stack[] = $config;
+  }
+
+  function addToBatchStack() {
+    return array_pop($this->batch_stack);
+  }
 }
