diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index 0d8f737..21aeee9 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -1347,22 +1347,23 @@ function _filter_autop($text) {
       }
     }
     elseif (!$ignore) {
+      $chunk = preg_replace('|<br\s*/?>|i', '<br />', $chunk); // normalize <br /> tags
       $chunk = preg_replace('|\n*$|', '', $chunk) . "\n\n"; // just to make things a little easier, pad the end
       $chunk = preg_replace('|<br />\s*<br />|', "\n\n", $chunk);
-      $chunk = preg_replace('!(<' . $block . '[^>]*>)!', "\n$1", $chunk); // Space things out a little
-      $chunk = preg_replace('!(</' . $block . '>)!', "$1\n\n", $chunk); // Space things out a little
+      $chunk = preg_replace('!(<' . $block . '[^>]*>)!i', "\n$1", $chunk); // Space things out a little
+      $chunk = preg_replace('!(</' . $block . '>)!i', "$1\n\n", $chunk); // Space things out a little
       $chunk = preg_replace("/\n\n+/", "\n\n", $chunk); // take care of duplicates
       $chunk = preg_replace('/^\n|\n\s*\n$/', '', $chunk);
-      $chunk = '<p>' . preg_replace('/\n\s*\n\n?(.)/', "</p>\n<p>$1", $chunk) . "</p>\n"; // make paragraphs, including one at the end
-      $chunk = preg_replace("|<p>(<li.+?)</p>|", "$1", $chunk); // problem with nested lists
+      $chunk = '<p>' . preg_replace('/\n\s*\n\n?(.)/i', "</p>\n<p>$1", $chunk) . "</p>\n"; // make paragraphs, including one at the end
+      $chunk = preg_replace("|<p>(<li.+?)</p>|i", "$1", $chunk); // problem with nested lists
       $chunk = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $chunk);
-      $chunk = str_replace('</blockquote></p>', '</p></blockquote>', $chunk);
-      $chunk = preg_replace('|<p>\s*</p>\n?|', '', $chunk); // under certain strange conditions it could create a P of entirely whitespace
-      $chunk = preg_replace('!<p>\s*(</?' . $block . '[^>]*>)!', "$1", $chunk);
-      $chunk = preg_replace('!(</?' . $block . '[^>]*>)\s*</p>!', "$1", $chunk);
+      $chunk = preg_replace('|</blockquote></p>|i', '</p></blockquote>', $chunk);
+      $chunk = preg_replace('|<p>\s*</p>\n?|i', '', $chunk); // under certain strange conditions it could create a P of entirely whitespace
+      $chunk = preg_replace('!<p>\s*(</?' . $block . '[^>]*>)!i', "$1", $chunk);
+      $chunk = preg_replace('!(</?' . $block . '[^>]*>)\s*</p>!i', "$1", $chunk);
       $chunk = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $chunk); // make line breaks
-      $chunk = preg_replace('!(</?' . $block . '[^>]*>)\s*<br />!', "$1", $chunk);
-      $chunk = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!', '$1', $chunk);
+      $chunk = preg_replace('!(</?' . $block . '[^>]*>)\s*<br />!i', "$1", $chunk);
+      $chunk = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!i', '$1', $chunk);
       $chunk = preg_replace('/&([^#])(?![A-Za-z0-9]{1,8};)/', '&amp;$1', $chunk);
     }
     $output .= $chunk;
diff --git a/core/modules/filter/lib/Drupal/filter/Tests/FilterUnitTest.php b/core/modules/filter/lib/Drupal/filter/Tests/FilterUnitTest.php
index de9f194..9945787 100644
--- a/core/modules/filter/lib/Drupal/filter/Tests/FilterUnitTest.php
+++ b/core/modules/filter/lib/Drupal/filter/Tests/FilterUnitTest.php
@@ -52,18 +52,28 @@ function testLineBreakFilter() {
       "aaa\nbbb\n\nccc" => array(
         "<p>aaa<br />\nbbb</p>\n<p>ccc</p>" => TRUE,
       ),
+      // Do not add tags near existing <br /> or <p> tags.
+      "aaa<br />\nbbb\n\nccc\n\n<p>\nddd\n</p>\neee" => array(
+        "<p>aaa<br />\nbbb</p>\n<p>ccc</p>\n<p>\nddd\n</p>\n<p>eee</p>" => TRUE,
+      ),
+      // Support different variants of <br />.
+      "aaa<br/>\nbbb<br>\nccc<BR>\nddd" => array(
+        "<p>aaa<br />\nbbb<br />\nccc<br />\nddd</p>" => TRUE,
+      ),
       // Skip contents of certain block tags entirely.
       "<script>aaa\nbbb\n\nccc</script>
 <style>aaa\nbbb\n\nccc</style>
 <pre>aaa\nbbb\n\nccc</pre>
 <object>aaa\nbbb\n\nccc</object>
 <iframe>aaa\nbbb\n\nccc</iframe>
+<IFRAME>aaa\nbbb\n\nccc</IFRAME>
 " => array(
         "<script>aaa\nbbb\n\nccc</script>" => TRUE,
         "<style>aaa\nbbb\n\nccc</style>" => TRUE,
         "<pre>aaa\nbbb\n\nccc</pre>" => TRUE,
         "<object>aaa\nbbb\n\nccc</object>" => TRUE,
         "<iframe>aaa\nbbb\n\nccc</iframe>" => TRUE,
+        "<IFRAME>aaa\nbbb\n\nccc</IFRAME>" => TRUE,
       ),
       // Skip comments entirely.
       "One. <!-- comment --> Two.\n<!--\nThree.\n-->\n" => array(
