diff --git a/core/modules/config/src/Tests/ConfigImportAllTest.php b/core/modules/config/src/Tests/ConfigImportAllTest.php
index 0a7216b..4cd4a3c 100644
--- a/core/modules/config/src/Tests/ConfigImportAllTest.php
+++ b/core/modules/config/src/Tests/ConfigImportAllTest.php
@@ -71,7 +71,6 @@ public function testInstallUninstall() {
 
     $fields = \Drupal::entityManager()->getStorage('field_config')->loadMultiple();
     \Drupal::entityManager()->getStorage('field_config')->delete($fields);
-    // Purge the data.
     field_purge_batch(1000);
 
     system_list_reset();
diff --git a/core/modules/filter/src/Entity/FilterFormat.php b/core/modules/filter/src/Entity/FilterFormat.php
index 944d5c7..efd0e73 100644
--- a/core/modules/filter/src/Entity/FilterFormat.php
+++ b/core/modules/filter/src/Entity/FilterFormat.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\filter\Entity;
 
+use Drupal\Component\Utility\DiffArray;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityWithPluginBagsInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
@@ -97,7 +98,7 @@ class FilterFormat extends ConfigEntityBase implements FilterFormatInterface, En
    *
    * An associative array of filters assigned to the text format, keyed by the
    * instance ID of each filter and using the properties:
-   * - plugin_id: The plugin ID of the filter plugin instance.
+   * - id: The plugin ID of the filter plugin instance.
    * - module: The name of the module providing the filter.
    * - status: (optional) A Boolean indicating whether the filter is
    *   enabled in the text format. Defaults to FALSE.
@@ -194,8 +195,17 @@ public function preSave(EntityStorageInterface $storage) {
 
     $this->name = trim($this->label());
 
-    // @todo Do not save disabled filters whose properties are identical to
-    //   all default properties.
+    // Remove disabled filters which have default configuration.
+    $this->filters = array_filter($this->filters, function($filter) {
+      if (!$filter['status']) {
+        // Compare the current settings to the default settings. If there are
+        // any customisations save them to configuration.
+        $default = \Drupal::service('plugin.manager.filter')->getDefinition($filter['id']);
+        $diff = DiffArray::diffAssocRecursive($filter, $default);
+        return !empty($diff);
+      }
+      return TRUE;
+    });
   }
 
   /**
diff --git a/core/modules/filter/src/Tests/FilterAPITest.php b/core/modules/filter/src/Tests/FilterAPITest.php
index 9e52420..f575ec3 100644
--- a/core/modules/filter/src/Tests/FilterAPITest.php
+++ b/core/modules/filter/src/Tests/FilterAPITest.php
@@ -329,6 +329,50 @@ function testTypedDataAPI() {
   }
 
   /**
+   * Tests that FilterFormat::preSave() only saves customized plugins.
+   */
+  public function testFilterFormatPreSave() {
+    /** @var \Drupal\filter\FilterFormatInterface $crazy_format */
+    $crazy_format = entity_create('filter_format', array(
+      'format' => 'crazy',
+      'name' => 'Crazy',
+      'weight' => 1,
+      'filters' => array(
+        'filter_html_escape' => array(
+          'weight' => 10,
+          'status' => 1,
+        ),
+        'filter_html' => array(
+          'weight' => -10,
+          'status' => 1,
+          'settings' => array(
+            'allowed_html' => '<p>',
+          ),
+        ),
+      )
+    ));
+    $crazy_format->save();
+    // Use config to directly load the configuration and check that only enabled
+    // or customized plugins are saved to configuration.
+    $filters = \Drupal::config('filter.format.crazy')->get('filters');
+    $this->assertEqual(array('filter_html_escape', 'filter_html'), array_keys($filters));
+
+    // Disable a plugin to ensure that disabled plugins with custom settings are
+    // stored in configuration.
+    $crazy_format->setFilterConfig('filter_html_escape', array('status' => FALSE));
+    $crazy_format->save();
+    $filters = \Drupal::config('filter.format.crazy')->get('filters');
+    $this->assertEqual(array('filter_html_escape', 'filter_html'), array_keys($filters));
+
+    // Set the settings as per default to ensure that disable plugins in this
+    // state are not stored in configuration.
+    $crazy_format->setFilterConfig('filter_html_escape', array('weight' => -10));
+    $crazy_format->save();
+    $filters = \Drupal::config('filter.format.crazy')->get('filters');
+    $this->assertEqual(array('filter_html'), array_keys($filters));
+  }
+
+  /**
    * Checks if an expected violation exists in the given violations.
    *
    * @param \Symfony\Component\Validator\ConstraintViolationListInterface $violations
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php
index c1529b8..807e4f5 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateFilterFormatTest.php
@@ -50,9 +50,9 @@ public function testFilterFormat() {
     $this->assertTrue($filters['filter_html']['status']);
 
     // These should be false by default.
-    $this->assertFalse($filters['filter_html_escape']['status']);
-    $this->assertFalse($filters['filter_caption']['status']);
-    $this->assertFalse($filters['filter_html_image_secure']['status']);
+    $this->assertFalse(isset($filters['filter_html_escape']));
+    $this->assertFalse(isset($filters['filter_caption']));
+    $this->assertFalse(isset($filters['filter_html_image_secure']));
 
     // Check variables migrated into filter.
     $this->assertIdentical($filters['filter_html']['settings']['allowed_html'], '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>');
diff --git a/core/modules/system/src/Tests/Entity/ConfigEntityImportTest.php b/core/modules/system/src/Tests/Entity/ConfigEntityImportTest.php
index 85cf0d2..96d7197 100644
--- a/core/modules/system/src/Tests/Entity/ConfigEntityImportTest.php
+++ b/core/modules/system/src/Tests/Entity/ConfigEntityImportTest.php
@@ -2,11 +2,12 @@
 
 /**
  * @file
- * Contains \Drupal\system\Tests\Entity\ConfigEntityImportTestBase.
+ * Contains \Drupal\system\Tests\Entity\ConfigEntityImportTest.
  */
 
 namespace Drupal\system\Tests\Entity;
 
+use Drupal\Component\Utility\DiffArray;
 use Drupal\Core\Entity\EntityWithPluginBagsInterface;
 use Drupal\simpletest\WebTestBase;
 
@@ -101,13 +102,13 @@ protected function doFilterFormatUpdate() {
     $entity->set('filters', $filters);
     $entity->save();
     $this->assertIdentical($filters, $entity->get('filters'));
-    $this->assertIdentical($filters, $plugin_bag->getConfiguration());
+    $this->assertIdentical($filters, $this->filterFilters($plugin_bag->getConfiguration()));
 
     $filters['filter_url']['settings']['filter_url_length'] = -100;
     $entity->getPluginBags()['filters']->setConfiguration($filters);
     $entity->save();
     $this->assertIdentical($filters, $entity->get('filters'));
-    $this->assertIdentical($filters, $plugin_bag->getConfiguration());
+    $this->assertIdentical($filters, $this->filterFilters($plugin_bag->getConfiguration()));
 
     // Read the existing data, and prepare an altered version in staging.
     $custom_data = $original_data = $this->container->get('config.storage')->read($name);
@@ -116,6 +117,26 @@ protected function doFilterFormatUpdate() {
   }
 
   /**
+   * Filters an array of filters to only include customized filters.
+   *
+   * @param array $filters
+   *   An array of filter plugin configurations keyed by plugin ID.
+   *
+   * @return array
+   *   The filtered array of filters.
+   */
+  protected function filterFilters(array $filters) {
+    return array_filter($filters, function($filter) {
+      $default = \Drupal::service('plugin.manager.filter')->getDefinition($filter['id']);
+      if (!$filter['status']) {
+        $diff = DiffArray::diffAssocRecursive($filter, $default);
+        return !empty($diff);
+      }
+      return TRUE;
+    });
+  }
+
+  /**
    * Tests updating an image style during import.
    */
   protected function doImageStyleUpdate() {
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index 30656be..f588cd3 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -78,11 +78,4 @@ function standard_install() {
 
   // Enable the admin theme.
   \Drupal::config('node.settings')->set('use_admin_theme', '1')->save();
-
-  // @todo Remove in https://www.drupal.org/node/2295129.
-  // Resave the plain_text formatter so that default filter plugins and
-  // dependencies are calculated correctly. This resolves an issue caused by the
-  // fact that filter is installed before editor but the standard profile also
-  // enables the file module.
-  entity_load('filter_format', 'plain_text')->save();
 }
