diff --git a/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterNull.php b/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterNull.php
new file mode 100644
index 0000000..8c2e791
--- /dev/null
+++ b/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterNull.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\filter\Plugin\Filter\FilterNull.
+ */
+
+namespace Drupal\filter\Plugin\Filter;
+
+use Drupal\filter\Annotation\Filter;
+use Drupal\Core\Annotation\Translation;
+use Drupal\filter\Plugin\FilterBase;
+
+/**
+ * Provides a filter to display no text.
+ *
+ * @Filter(
+ *   id = "filter_null",
+ *   module = "filter",
+ *   title = @Translation("Returns the empty string"),
+ *   type = FILTER_TYPE_HTML_RESTRICTOR,
+ *   weight = -10
+ * )
+ */
+class FilterNull extends FilterBase {
+
+  /**
+   * Tracks if an alert about this filter has been logged.
+   *
+   * @var bool
+   */
+  protected $logged = FALSE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
+    // Once per filter, log that a filter plugin was missing.
+    if (!$this->logged) {
+      watchdog('filter', 'Missing filter plugin: %filter.', array('%filter' => $plugin_id), WATCHDOG_ALERT);
+    }
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process($text, $langcode, $cache, $cache_id) {
+    return '';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getHTMLRestrictions() {
+    // Nothing is allowed.
+    return array('allowed' => array());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function tips($long = FALSE) {
+    return t('No HTML tags allowed.');
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilterFormatUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilterFormatUpgradePathTest.php
index 1a42c7f..12561d7 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilterFormatUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FilterFormatUpgradePathTest.php
@@ -73,6 +73,24 @@ public function testFilterFormatUpgrade() {
     // Check that role 5 cannot access to the defined text formats
     $this->assertNoFieldChecked('edit-5-use-text-format-format-one', 'Use text format format_one permission for role is set correctly.');
     $this->assertNoFieldChecked('edit-5-use-text-format-format-two', 'Use text format format_two permission for role is set correctly.');
+
+    // Check that missing
+    $two = filter_format_load('format_two');
+    $this->assertTrue($two->filters()->has('missing_filter'));
+
+    // Try to use a filter format with a missing filter, this should not throw
+    // an exception.
+    $empty_markup = check_markup($this->randomName(), 'format_two');
+    $this->assertIdentical($empty_markup, '', 'The filtered text is empty while a filter is missing.');
+
+    // Editing and saving the format should drop the missing filter.
+    $this->drupalGet('admin/config/content/formats/manage/format_two');
+    $this->assertRaw(t('The %filter filter is missing, and will be removed once this format is saved.', array('%filter' => 'missing_filter')));
+    $this->drupalPost(NULL, array(), t('Save configuration'));
+    filter_formats_reset();
+    $two = filter_format_load('format_two');
+    $this->assertFalse($two->filters()->has('missing_filter'));
+
   }
 
 }
diff --git a/core/modules/system/tests/upgrade/drupal-7.filter_formats.database.php b/core/modules/system/tests/upgrade/drupal-7.filter_formats.database.php
index 402670c..dc64b28 100644
--- a/core/modules/system/tests/upgrade/drupal-7.filter_formats.database.php
+++ b/core/modules/system/tests/upgrade/drupal-7.filter_formats.database.php
@@ -132,6 +132,14 @@
   'status' => '1',
   'settings' => 'a:1:{s:17:"filter_url_length";s:2:"72";}',
 ))
+->values(array(
+  'format' => 'format_two',
+  'module' => 'missing_module',
+  'name' => 'missing_filter',
+  'weight' => '0',
+  'status' => '1',
+  'settings' => 'a:0:{}',
+))
 ->execute();
 
 // Define which roles can use the text formats.
