More tweaks
diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php
index 66c2185..3e465d7 100644
--- a/system/libraries/Typography.php
+++ b/system/libraries/Typography.php
@@ -71,8 +71,8 @@
 			$str = preg_replace("#<([^><]+?)([^a-z_\-]on\w*|xmlns)(\s*=\s*[^><]*)([><]*)#i", "<\\1\\4", $str);
  		}       
 
-		// Convert quotes within tags to temporary marker.
-		// We don't want quotes converted within tags so we'll temporarily convert them to {@DQ} and {@SQ}
+		// Convert quotes within tags to temporary markers. We don't want quotes converted 
+		// within tags so we'll temporarily convert them to {@DQ} and {@SQ}
 		if (preg_match_all("#\<.+?>#si", $str, $matches))
 		{
 			for ($i = 0; $i < count($matches['0']); $i++)
@@ -85,7 +85,7 @@
 	
 		// Convert "ignore" tags to temporary marker.  The parser splits out the string at every tag 
 		// it encounters.  Certain inline tags, like image tags, links, span tags, etc. will be 
-		// adversely affected if they are split out so we'll convert the opening < temporarily to: {@TAG}
+		// adversely affected if they are split out so we'll convert the opening bracket < temporarily to: {@TAG}
 		$str = preg_replace("#<(/*)(".$this->ignore_elements.")#i", "{@TAG}\\1\\2", $str);	
 
 		// Split the string at every tag.  This expression creates an array with this prototype:
@@ -128,14 +128,8 @@
 			$str .= $this->format_newlines($chunk);
 		}
 
-		// Convert Quotes, elipsis, and em-dashes
+		// Convert quotes, elipsis, and em-dashes
 		$str = $this->format_characters($str);
-
-		// Do we need to reduce empty lines?
-		if ($this->reduce_empty_lines == TRUE)
-		{
-			$str = preg_replace('#(<p>\n*</p>)#', '', $str);
-		}
 	
 		// Final clean up
 		$table = array(
@@ -145,11 +139,11 @@
 						'/(<p.*?>)<p>/'		=> '$1', // <?php BBEdit syntax coloring bug fix
 						
 						// Reduce multiple instances of opening/closing paragraph tags to a single one
-						'/(<\/p>)+/'		=> '</p>',
+						'#(</p>)+#'		=> '</p>',
 						'/(<p><p>)+/'		=> '<p>',
 						
 						// Clean up stray paragraph tags that appear before block level elements
-						'/<p><\/p><('.$this->block_elements.')/'	=> '<$1',
+						'#<p></p><('.$this->block_elements.')#'	=> '<$1',
 			
 						// Replace the temporary markers we added earlier
 						'/\{@TAG\}/'		=> '<',
@@ -158,6 +152,18 @@
 
 						);
 	
+		// Do we need to reduce empty lines?
+		if ($this->reduce_empty_lines == TRUE)
+		{
+			$table['#<p>\n*</p>#'] = '';
+		}
+		else
+		{
+			// If we have empty paragraph tags we add a non-breaking space
+			// otherwise most browsers won't treat them as true paragraphs
+			$table['#<p></p>#'] = '<p>&nbsp;</p>';
+		}
+	
 		return preg_replace(array_keys($table), $table, $str);
 
 	}