diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index e857224..77c5f9a 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -1635,23 +1635,23 @@ function _filter_autop($text) {
       }
     }
     elseif (!$ignore) {
-      $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("/\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 = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $chunk);
+      $chunk = preg_replace('`\n*$`', '', $chunk) . "\n\n"; // just to make things a little easier, pad the end
+      $chunk = preg_replace('`<br ?/?>\s*<br ?/?>`i', "\n\n", $chunk);
+      $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>`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('|(?<!<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|th|pre|td|ul|ol)>)!', '$1', $chunk);
-      $chunk = preg_replace('/&([^#])(?![A-Za-z0-9]{1,8};)/', '&amp;$1', $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 />|<br/>|<br>)\s*\n`i', "<br />\n", $chunk); // make line breaks
+      $chunk = preg_replace('`(</?' . $block . '[^>]*>)\s*<br ?/?>`i', '$1', $chunk);
+      $chunk = preg_replace('`<br ?/?>(\s*</?(?:p|li|div|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/filter.test b/core/modules/filter/filter.test
index 2bafd47..f8e4dc6 100644
--- a/core/modules/filter/filter.test
+++ b/core/modules/filter/filter.test
@@ -854,6 +854,12 @@ class FilterUnitTestCase extends DrupalUnitTestCase {
     );
     $this->assertFilteredString($filter, $tests);
 
+    $f = _filter_autop('<P>foo</P>');
+    $this->assertEqual(trim($f), '<P>foo</P>', t('Make sure line breaking supports upper-case tag names.').$f);
+
+    $f = _filter_autop('<TABLE><TR><TD>foo</TD><TD>aaa<BR>\nbbb</TD></TR></TABLE>');
+    $this->assertEqual(preg_replace('/\s/', '', $f), preg_replace('/\s/', '', $f), t('Make sure line breaking supports upper-case tag names.'));
+
     // Very long string hitting PCRE limits.
     $limit = max(ini_get('pcre.backtrack_limit'), ini_get('pcre.recursion_limit'));
     $source = $this->randomName($limit);
