diff --git a/config/install/config_ignore.settings.yml b/config/install/config_ignore.settings.yml
index 629b342..c89e103 100644
--- a/config/install/config_ignore.settings.yml
+++ b/config/install/config_ignore.settings.yml
@@ -1 +1,2 @@
 ignored_config_entities: { }
+ignored_config_collections: { }
diff --git a/config/schema/config_ignore.schema.yml b/config/schema/config_ignore.schema.yml
index 9930f0d..889c34c 100644
--- a/config/schema/config_ignore.schema.yml
+++ b/config/schema/config_ignore.schema.yml
@@ -7,3 +7,8 @@ config_ignore.settings:
       label: 'List of ignored configurations'
       sequence:
         type: string
+    ignored_config_collections:
+      type: sequence
+      label: 'List of ignored configuration storage collections'
+      sequence:
+        type: string
diff --git a/config_ignore.api.php b/config_ignore.api.php
index 89e9f91..1054e84 100644
--- a/config_ignore.api.php
+++ b/config_ignore.api.php
@@ -18,6 +18,13 @@ function hook_config_ignore_settings_alter(array &$settings) {
   $settings[] = 'field.*';
 }
 
+/**
+ * Alter the list of config entities that should be ignored.
+ */
+function hook_config_ignore_collections_alter(array &$collections) {
+  $collections[] = 'language.*';
+}
+
 /**
  * @} End of "addtogroup hooks".
  */
diff --git a/config_ignore.install b/config_ignore.install
index 80534e2..894f5a2 100644
--- a/config_ignore.install
+++ b/config_ignore.install
@@ -13,9 +13,17 @@ function config_ignore_update_8201() {
 }
 
 /**
- * Remove index from configuration export.
+ * Update schema with storage collection ignore value.
  */
 function config_ignore_update_8202() {
+  $config = \Drupal::configFactory()->getEditable('config_ignore.settings');
+  $config->set('ignored_config_collections', [])->save();
+}
+
+/**
+ * Remove index from configuration export.
+ */
+function config_ignore_update_8203() {
   $config = \Drupal::configFactory()->getEditable('config_ignore.settings');
   $ignored_config_entities = $config->get('ignored_config_entities') ?: [];
   $config->set('ignored_config_entities', array_values($ignored_config_entities));
diff --git a/src/Form/Settings.php b/src/Form/Settings.php
index 16f05fd..e73a27e 100644
--- a/src/Form/Settings.php
+++ b/src/Form/Settings.php
@@ -54,6 +54,16 @@ Examples: <ul>
       '#default_value' => implode(PHP_EOL, $config_ignore_settings->get('ignored_config_entities')),
       '#size' => 60,
     ];
+
+    $form['ignored_config_collections'] = [
+      '#type' => 'textarea',
+      '#rows' => 10,
+      '#title' => $this->t('Configuration storage collections to ignore'),
+      '#description' => $this->t('Use the same format for including/excluding/wildcarding as above (e.g. language.* for ignoring all language collections).'),
+      '#default_value' => implode(PHP_EOL, $config_ignore_settings->get('ignored_config_collections') ?: []),
+      '#size' => 60,
+    ];
+
     return parent::buildForm($form, $form_state);
   }
 
@@ -67,6 +77,9 @@ Examples: <ul>
     $config_ignore_settings_array = array_filter($config_ignore_settings_array);
     $config_ignore_settings_array = array_values($config_ignore_settings_array);
     $config_ignore_settings->set('ignored_config_entities', $config_ignore_settings_array);
+    $config_collection_storage_array = preg_split("[\n|\r]", $values['ignored_config_collections']);
+    $config_collection_storage_array = array_filter($config_collection_storage_array);
+    $config_ignore_settings->set('ignored_config_collections', $config_collection_storage_array);
     $config_ignore_settings->save();
     parent::submitForm($form, $form_state);
 
diff --git a/src/Plugin/ConfigFilter/CollectionIgnore.php b/src/Plugin/ConfigFilter/CollectionIgnore.php
new file mode 100644
index 0000000..113b2b7
--- /dev/null
+++ b/src/Plugin/ConfigFilter/CollectionIgnore.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace Drupal\config_ignore\Plugin\ConfigFilter;
+
+use Drupal\config_filter\Plugin\ConfigFilterBase;
+use Drupal\Core\Config\StorageInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Site\Settings;
+
+/**
+ * Provides a filter that skips language collections.
+ *
+ * @ConfigFilter(
+ *   id = "collection_ignore",
+ *   label = "Config Collection Ignore",
+ *   storages = {"config.storage.sync", "config.storage.active"},
+ *   weight = 102
+ * )
+ */
+class CollectionIgnore extends ConfigFilterBase implements ContainerFactoryPluginInterface {
+
+  private const FORCE_EXCLUSION_PREFIX = '~';
+
+  /**
+   * The active configuration storage.
+   *
+   * @var \Drupal\Core\Config\StorageInterface
+   */
+  protected $active;
+
+  /**
+   * Constructs a new SplitFilter.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param array $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Config\StorageInterface $active
+   *   The active configuration store with the configuration on the site.
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, StorageInterface $active) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->active = $active;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    // Get the list of ignored config collections.
+    $ignored_collections = $container->get('config.factory')->get('config_ignore.settings')->get('ignored_config_collections') ?: [];
+    // Allow hooks to alter the list.
+    $container->get('module_handler')->invokeAll('config_ignore_collections_alter', [&$ignored_collections]);
+    // Set the list in the plugin configuration.
+    $configuration['ignored_collections'] = $ignored_collections;
+
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('config.storage')
+    );
+  }
+
+  /**
+   * Match a storage collection name against list of ignored collections.
+   *
+   * @return bool
+   *   True, if the storage collection is to be ignored, false otherwise.
+   */
+  protected function matchCollectionName() {
+    $collection_name = $this->getSourceStorage()->getCollectionName();
+    if (empty($collection_name) || Settings::get('config_ignore_deactivate')) {
+      // Allow deactivating config_ignore in settings.php. Do not match any name
+      // in that case and allow a normal configuration import to happen.
+      return FALSE;
+    }
+
+    // If the string is an excluded collection, don't ignore it.
+    if (in_array(self::FORCE_EXCLUSION_PREFIX . $collection_name, $this->configuration['ignored_collections'], TRUE)) {
+      return FALSE;
+    }
+
+    foreach ($this->configuration['ignored_collections'] as $ignored) {
+      if (fnmatch($ignored, $collection_name)) {
+        return TRUE;
+      }
+    }
+
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function filterRead($name, $data) {
+    if (!$this->matchCollectionName()) {
+      return parent::filterRead($name, $data);
+    }
+
+    $filtered_data = $this->active->read($name);
+    if (!$filtered_data) {
+      return $data;
+    }
+
+    return $filtered_data;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function filterReadMultiple(array $names, array $data) {
+    if (!$this->matchCollectionName()) {
+      return parent::filterReadMultiple($names, $data);
+    }
+
+    $filtered_data = [];
+    foreach ($names as $name) {
+      if (!array_key_exists($name, $data)) {
+        $data[$name] = [];
+      }
+      $filtered_data[$name] = $this->active->read($name);
+      if (!$filtered_data[$name]) {
+        $filtered_data[$name] = $data[$name];
+      }
+    }
+    return $filtered_data;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function filterExists($name, $exists) {
+    if (!$this->matchCollectionName()) {
+      parent::filterExists($name, $exists);
+    }
+
+    return $exists || $this->active->exists($name);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function filterListAll($prefix, array $data) {
+    if (!$this->matchCollectionName()) {
+      parent::filterListAll($prefix, $data);
+    }
+
+    $active_names = $this->active->listAll($prefix);
+    // Return the data with the active names which are ignored merged in.
+    return array_unique(array_merge($data, $active_names));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function filterCreateCollection($collection) {
+    return new static($this->configuration, $this->pluginId, $this->pluginDefinition, $this->active->createCollection($collection));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function filterGetAllCollectionNames(array $collections) {
+    // Add active collection names as there could be ignored config in them.
+    return array_merge($collections, $this->active->getAllCollectionNames());
+  }
+
+}
