diff --git a/modules/features_ui/css/features_ui.admin.css b/modules/features_ui/css/features_ui.admin.css
index 8c283fb..c722eb7 100644
--- a/modules/features_ui/css/features_ui.admin.css
+++ b/modules/features_ui/css/features_ui.admin.css
@@ -203,6 +203,14 @@ span.features-component-list .features-dependency {
   font-weight: bold !important;
 }
 
+.features-diff-header-action {
+  font-size: small;
+}
+
+.features-filter-hidden,
+.features-diff-hidden {
+  display: none !important;
+}
 #features-filter input[size="60"].form-text {
   width: 200px;
 }
@@ -221,13 +229,16 @@ span.features-component-list .features-dependency {
   display: inline;
   width: auto;
 }
-#features-filter .form-item {
+#features-filter .form-item,
+#features-filter .features-toggle-components {
   float: left;
   margin: 5px 0;
   padding: 0;
 }
-#features-filter .form-item.form-type-checkbox {
-  margin: 5px 0;
+#features-filter .form-item.form-type-checkbox,
+#features-filter .features-toggle-components {
+  display: inline-block;
+  margin: 5px;
 }
 #features-filter span {
   float: left;
@@ -243,7 +254,8 @@ span.features-component-list .features-dependency {
   background: #def;
 }
 
-#features-export-wrapper div.features-export-parent {
+#features-export-wrapper div.features-export-parent,
+#features-export-wrapper .features-missing-items {
   clear: both;
   margin: 0 0 10px;
 }
diff --git a/modules/features_ui/features_ui.libraries.yml b/modules/features_ui/features_ui.libraries.yml
index 07a4d49..da7ab9a 100644
--- a/modules/features_ui/features_ui.libraries.yml
+++ b/modules/features_ui/features_ui.libraries.yml
@@ -1,5 +1,4 @@
 drupal.features_ui.admin:
-  version: VERSION
   css:
     theme:
       css/features_ui.admin.css: {}
diff --git a/modules/features_ui/js/features_ui.admin.js b/modules/features_ui/js/features_ui.admin.js
index f53edf4..804107d 100644
--- a/modules/features_ui/js/features_ui.admin.js
+++ b/modules/features_ui/js/features_ui.admin.js
@@ -69,7 +69,7 @@ jQuery.fn.sortElements = (function () {
 
 })();
 
-(function ($) {
+(function ($, Drupal) {
 
   "use strict";
 
@@ -81,8 +81,8 @@ jQuery.fn.sortElements = (function () {
       // For (var configType in drupalSettings.features.conflicts) {.
           if (drupalSettings.features.conflicts) {
             var configConflicts = drupalSettings.features.conflicts;
-            $('#features-export-wrapper input[type=checkbox]', context).each(function () {
-              if (!$(this).hasClass('features-checkall')) {
+            $('#features-export-wrapper .features-export-parent input[type=checkbox]', context).each(function () {
+              if (!$(this).hasClass('features-filter')) {
                 var key = $(this).attr('name');
                 var matches = key.match(/^([^\[]+)(\[.+\])?\[(.+)\]\[(.+)\]$/);
                 var component = matches[1];
@@ -161,10 +161,13 @@ jQuery.fn.sortElements = (function () {
         else {
           $(item).removeAttr('checked');
         }
-        $(newParent).parents('.component-list').removeClass('features-export-empty');
+        var $newParents = $(newParent);
+        $newParents.parents('.component-list').removeClass('features-export-empty');
+        // Unhide the config type group.
+        $newParents.parents('.features-export-parent').removeClass('features-filter-hidden');
 
         // re-sort new list of checkboxes based on labels.
-        $(newParent).find('label').sortElements(
+        $newParents.find('label').sortElements(
           function (a, b) {
             return $(a).text() > $(b).text() ? 1 : -1;
           },
@@ -201,8 +204,8 @@ jQuery.fn.sortElements = (function () {
         // the auto-detected items.
         var items = [];  // Will contain a list of selected items exported to feature.
         var components = {};  // Contains object of component names that have checked items.
-        $('#features-export-wrapper input[type=checkbox]:checked', context).each(function () {
-          if (!$(this).hasClass('features-checkall')) {
+        $('#features-export-wrapper .features-export-parent input[type=checkbox]:checked', context).each(function () {
+          if (!$(this).hasClass('features-filter')) {
             var key = $(this).attr('name');
             var matches = key.match(/^([^\[]+)(\[.+\])?\[(.+)\]\[(.+)\]$/);
             components[matches[1]] = matches[1];
@@ -259,7 +262,7 @@ inTimeout--; }
       }
 
       // Handle component selection UI.
-      $('#features-export-wrapper input[type=checkbox]', context).click(function () {
+      $('#features-export-wrapper .features-export-parent input[type=checkbox]', context).click(function () {
         _resetTimeout();
         if ($(this).hasClass('component-select')) {
           moveCheckbox(this, 'added', true);
@@ -290,6 +293,42 @@ inTimeout--; }
         _resetTimeout();
       });
 
+      // Handle hide/show components.
+      $('#features-filter .features-hide-component.form-select', context).change(function () {
+        var $exportWrapper = $('#features-export-wrapper', context);
+        var componentType = $(this).val();
+        $exportWrapper
+            .find('.features-filter-hidden')
+            .removeClass('features-filter-hidden');
+        if (componentType) {
+          if (componentType === 'included+groups') {
+            componentType = 'included';
+            // Hide empty config components.
+            $exportWrapper.find('.component-count').filter(function() {
+              return $(this).text() === '0';
+            }).parents('.features-export-parent').addClass('features-filter-hidden');
+          }
+          $exportWrapper.find('.features-export-parent .component-' + componentType).addClass('features-filter-hidden');
+        }
+      });
+
+      // Collapse/Expand components.
+      $('#features-filter .features-toggle-components', context).click(function (e) {
+        e.preventDefault();
+        e.stopPropagation();
+        var expandAll = Drupal.t('Expand all');
+        var collapseAll = Drupal.t('Collapse all');
+        var $this = $(this);
+        var $components = $('.features-export-component', context);
+        if (expandAll == $this.text()) {
+          $components.attr('open', true);
+          $this.text(collapseAll);
+        } else {
+          $components.attr('open', false);
+          $this.text(expandAll);
+        }
+      });
+
       // Handle filtering.
       // Provide timer for auto-refresh trigger.
       var filterTimeoutID = 0;
@@ -396,6 +435,25 @@ inTimeout--; }
           $(this).parents('tr').removeClass('selected');
         }
       });
+      // Show/Hide components.
+      $('.features-diff-header-action-link', context).click(function (e) {
+        e.preventDefault();
+        e.stopPropagation();
+        var showAll = Drupal.t('Show all');
+        var hideAll = Drupal.t('Hide all');
+        var $this = $(this);
+        var $checkbox = $this.closest('tr').find('td:nth-child(1) input:checkbox');
+        var $elements = $this.closest('table').find('tr.diff-' + $checkbox.prop('value'));
+        if (hideAll == $this.text()) {
+          $this.text(showAll);
+          $elements.addClass('features-diff-hidden');
+        }
+        else {
+          $this.text(hideAll);
+          $elements.removeClass('features-diff-hidden');
+        }
+      });
+
       $('.features-diff-listing thead th:nth-child(2)', context).click(function () {
         var checkbox = $(this).parent().find('th input:checkbox');
         checkbox.click();
@@ -403,4 +461,4 @@ inTimeout--; }
     }
   };
 
-})(jQuery);
+})(jQuery, Drupal);
diff --git a/modules/features_ui/src/Form/FeaturesDiffForm.php b/modules/features_ui/src/Form/FeaturesDiffForm.php
index ad4094c..f9d592e 100644
--- a/modules/features_ui/src/Form/FeaturesDiffForm.php
+++ b/modules/features_ui/src/Form/FeaturesDiffForm.php
@@ -134,13 +134,20 @@ class FeaturesDiffForm extends FormBase {
         $missing = $this->featuresManager->reorderMissing($this->featuresManager->detectMissing($package));
         $overrides = $this->featuresManager->detectOverrides($package, TRUE);
         if (!empty($overrides) || !empty($missing)) {
+          $header_title = $this->t(
+            '@package_name <small class="features-diff-header-action">(<a class="features-diff-header-action-link" href="#">@action</a>)</small>',
+            [
+              '@package_name' => Html::escape($package->getName()),
+              '@action' => $this->t('Hide all'),
+            ]
+          );
           $options += [
             $package->getMachineName() => [
               'row' => [
                 'data' => [
                   '#type' => 'html_tag',
                   '#tag' => 'h2',
-                  '#value' => Html::escape($package->getName()),
+                  '#value' => $header_title,
                 ],
               ],
               '#attributes' => [
diff --git a/modules/features_ui/src/Form/FeaturesEditForm.php b/modules/features_ui/src/Form/FeaturesEditForm.php
index 58736f9..6a942a3 100644
--- a/modules/features_ui/src/Form/FeaturesEditForm.php
+++ b/modules/features_ui/src/Form/FeaturesEditForm.php
@@ -454,7 +454,42 @@ class FeaturesEditForm extends FormBase {
       '#hidden' => TRUE,
       '#title' => $this->t('Select all'),
       '#attributes' => [
-        'class' => ['features-checkall'],
+        'class' => [
+          'features-checkall',
+          'features-filter',
+        ],
+      ],
+    ];
+    $element['features_filter_wrapper']['toggle-components'] = [
+      '#type' => 'html_tag',
+      '#tag' => 'a',
+      '#value' => $this->t('Expand all'),
+      '#attributes' => [
+        'href' => '#',
+        'title' => $this->t('Expand/collapse components in order to "Select all".'),
+        'class' => [
+          'features-toggle-components',
+          'features-filter',
+        ],
+      ],
+    ];
+    $element['features_filter_wrapper']['hide-components'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Hide'),
+      '#options' => [
+        'included' => $this->t('Normal'),
+        'included+groups' => $this->t('Normal (and empty groups)'),
+        'added' => $this->t('Added'),
+        'conflict' => $this->t('Conflict'),
+        'detected' => $this->t('Auto detected'),
+      ],
+      '#empty_option' => $this->t('- None -'),
+      '#default_value' => '',
+      '#attributes' => [
+        'class' => [
+          'features-hide-component',
+          'features-filter',
+        ],
       ],
     ];
 
@@ -529,6 +564,11 @@ class FeaturesEditForm extends FormBase {
 
     $element['features_missing'] = [
       '#theme' => 'item_list',
+      '#wrapper_attributes' => [
+        'class' => [
+          'features-missing-items',
+        ],
+      ],
       '#items' => $export['missing'],
       '#title' => $this->t('Configuration missing from active site:'),
       '#suffix' => '<div class="description">' . $this->t('Import the feature to create the missing config listed above.') . '</div>',
