diff --git a/user-apps/Grr/Components/ArticleView/NSString+TolerantHTML.m b/user-apps/Grr/Components/ArticleView/NSString+TolerantHTML.m
index 6cff303d..5223fefe 100644
--- a/user-apps/Grr/Components/ArticleView/NSString+TolerantHTML.m
+++ b/user-apps/Grr/Components/ArticleView/NSString+TolerantHTML.m
@@ -147,9 +147,9 @@ void init_constants() {
 -(void) foundPlaintext: (NSString*) string;
 -(void) foundEscape: (NSString*) escape;
 -(void) foundNewline;
--(void) foundOpeningTagName: (NSString*) name
+-(BOOL) foundOpeningTagName: (NSString*) name
                  attributes: (NSDictionary*) attributes;
--(void) foundClosingTagName: (NSString*) name
+-(BOOL) foundClosingTagName: (NSString*) name
                  attributes: (NSDictionary*) attributes;
 
 +(NSFont*) fixedPitchFont;
@@ -270,7 +270,7 @@ void init_constants() {
 -(void) foundPlaintext: (NSString*) string
 {
     NSAttributedString* plainText;
-    plainText = [[[NSAttributedString alloc] initWithString: string attributes: [self style]] retain];
+    plainText = [[NSAttributedString alloc] initWithString: string attributes: [self style]];
     
     [resultDocument appendAttributedString: plainText];
     [plainText release];
@@ -315,23 +315,34 @@ void init_constants() {
 //    the methods that dispatch tags to their specific methods
 // -----------------------------------------------------------
 
--(void) foundOpeningTagName: (NSString*) name
+/* YES - found interpretable, NO - unknown tag */
+-(BOOL) foundOpeningTagName: (NSString*) name
                  attributes: (NSDictionary*) attributes
 {
   NSString* str = [openingTagsHandlers objectForKey: name];
 
-  if (str != nil) 
-    [self performSelector: NSSelectorFromString(str) withObject: attributes];
+  if (str != nil)
+    {
+      [self performSelector: NSSelectorFromString(str) withObject: attributes];
+      return YES;
+    }
 
+  return NO;
 }
 
--(void) foundClosingTagName: (NSString*) name
+/* YES - found interpretable, NO - unknown tag */
+-(BOOL) foundClosingTagName: (NSString*) name
                  attributes: (NSDictionary*) attributes;
 {
   NSString* str = [closingTagsHandlers objectForKey: name];
 
   if (str != nil)
-    [self performSelector: NSSelectorFromString(str)];
+    {
+      [self performSelector: NSSelectorFromString(str)];
+      return YES;
+    }
+
+  return NO;
 }
 
 // -----------------------------------------------------------
@@ -489,6 +500,10 @@ void init_constants() {
     NSString* str = nil;
     HTMLInterpreter* interpreter = [HTMLInterpreter sharedInterpreter];
     NSAttributedString* result;
+    BOOL pre = NO;     // the flag of being inside <pre>...</pre>
+    NSUInteger start;  // the start position of any tag '<'
+    NSUInteger end;    // the position following of the end of any tag '>'
+    BOOL res;          // to store boolean returns of functions
 
     init_constants();    
     [interpreter startParsing];
@@ -503,7 +518,7 @@ void init_constants() {
         if ([scanner isAtEnd] == NO) {
 	    unichar ch = [self characterAtIndex: [scanner scanLocation]];
             if (ch == '&') {
-	        NSUInteger start = [scanner scanLocation]; // store & location in case of misparse
+	        NSUInteger ret = [scanner scanLocation]; // store & location in case of misparse
                 [scanner scanString: @"&" intoString: (NSString**)nil];
 		[scanner scanUpToCharactersFromSet: entityEndSet intoString: &str];
 		if ([self characterAtIndex: [scanner scanLocation]] == ';')
@@ -514,15 +529,22 @@ void init_constants() {
 		else // we ended entity without proper ; termination
 		  {
 		    [interpreter foundPlaintext: @"&"];
-		    [scanner setScanLocation: start + 1];
+		    [scanner setScanLocation: ret + 1];
 		  }
             } else if (ch == '\n') {
-                BOOL res;
-
-                NSLog(@"parse newline");
-                res = [scanner scanCharactersFromSet: whitespaces intoString: (NSString**)nil];
-                NSAssert(res == YES, @"Couldn't parse newline!");
-                [interpreter foundNewline];
+	      if (!pre)
+		{
+		  NSLog(@"parse newline");
+		  res = [scanner scanCharactersFromSet: whitespaces intoString: (NSString**)nil];
+		  NSAssert(res == YES, @"Couldn't parse newline!");
+		  [interpreter foundNewline];
+	        }
+	      else
+		{
+		  // if <pre> keep it as is
+		  [scanner scanString: @"\n" intoString: (NSString**)nil];
+		  [interpreter foundPlaintext: @"\n"];
+		}
             } else {
                 NSString* name = nil;
                 BOOL opening = YES;
@@ -535,14 +557,41 @@ void init_constants() {
                 attrDict = [NSMutableDictionary new];
                 
                 // default values, change dependent on if it's <xxx>, <xxx/> or </xxx>
-                
+                start = [scanner scanLocation]; // store the start of tag
                 [scanner scanString: @"<" intoString: (NSString**)nil];
 
-                if ([self characterAtIndex: [scanner scanLocation]] == '/') {
-                    [scanner scanString: @"/" intoString: (NSString**)nil];
+		nextChar = [self characterAtIndex: [scanner scanLocation]];
+                if (nextChar == '/') {
+		    [scanner scanString: @"/" intoString: (NSString**)nil];
                     closing = YES;
                     opening = NO;
-                }
+                } else if (nextChar == '?') {
+		  // <?xml.....?>
+		  [scanner setScanLocation: start]; // return to <
+		  [scanner scanUpToString: @"?>" intoString: &str];
+		  NSAssert(str != nil, @"Malformed '<?'");
+		  [scanner scanString: @"?>" intoString: (NSString**)nil];
+		  if (pre)
+		    {
+		      // outside of <pre> it is hidden
+		      [interpreter foundPlaintext: str];
+		      [interpreter foundPlaintext: @"?>"];
+		    }
+		  continue;
+		} else if (nextChar == '!') {
+		  // <!-- -->
+		  [scanner setScanLocation: start]; // return to <
+		  [scanner scanUpToString: @"-->" intoString: &str];
+		  NSAssert(str != nil, @"Malformed '<!--'");
+		  [scanner scanString: @"-->" intoString: (NSString**)nil];
+		  if (pre)
+		    {
+		      // outside of <pre> comments are hidden
+		      [interpreter foundPlaintext: str];
+		      [interpreter foundPlaintext: @"-->"];
+		    }
+		  continue;
+		}
 
                 [scanner scanUpToCharactersFromSet: whitespacesAndTagClosing intoString: &name];
                 [scanner scanCharactersFromSet: whitespaces intoString: (NSString**)nil];
@@ -585,37 +634,57 @@ void init_constants() {
                 }
                 
                 if (nextChar == '/') {
-                    [scanner scanString: @"/" intoString: (NSString**)nil];
+		    [scanner scanString: @"/" intoString: (NSString**)nil];
                     closing = YES;
                     opening = YES;
                 }
                 
                 [scanner scanString: @">" intoString: (NSString**)nil];
+		end = [scanner scanLocation]; // store the after end of tag
 
                 // normalise element name
                 name = [name lowercaseString];
 
                 if (opening) {
-                    [interpreter foundOpeningTagName: name
-                                          attributes: attrDict];
-                    
-                    // exceptional case: When it's a <pre>-Tag, everything until
-                    // the closing </pre> is semantically ignored and just put into
-                    // the string. (It's still the interpreter's responsibility to
-                    // choose an appropriate font, though.)
-                    // TODO: People use <br/> inside <pre>, parse that!
+		  res = [interpreter foundOpeningTagName: name
+					      attributes: attrDict];
+
+		  if (pre && !res)
+		    {
+		      // do not eat unknown tags inside <pre>
+		      [interpreter foundPlaintext:
+				     [self substringWithRange: NSMakeRange(start, end - start)]];
+		    }
+
+		  // TODO: People use <br/> inside <pre>, parse that!
                     if ([name isEqualToString: @"pre"]) {
-                        NSString* preformattedText;
+		      NSString* preformattedText;
+
+		      NSAssert(!pre, @"nested <pre>");
+
+		        NSUInteger ret = [scanner scanLocation]; // store the location of <pre>' body start
                         [scanner scanUpToString: @"</pre" intoString: &preformattedText];
-                        
+
                         NSAssert(preformattedText != nil, @"No matching closing </pre> tag");
-                        [interpreter foundPlaintext: preformattedText];
+
+			[scanner setScanLocation: ret];
+			pre = YES;
                     }
                 }
                 
                 if (closing) {
-                    [interpreter foundClosingTagName: name
-                                          attributes: attrDict];
+		  res = [interpreter foundClosingTagName: name
+					      attributes: attrDict];
+		  if (pre && !res)
+		    {
+		      // do not eat unknown tags inside <pre>
+		      [interpreter foundPlaintext:
+				     [self substringWithRange: NSMakeRange(start, end - start)]];
+		    }
+
+		    if ([name isEqualToString: @"pre"]) {
+		      pre = NO;
+		    }
                 }
             }
         }
diff --git a/user-apps/Grr/Resources/Data/HTML-Entities.plist b/user-apps/Grr/Resources/Data/HTML-Entities.plist
index 623e28a8..6399afca 100644
--- a/user-apps/Grr/Resources/Data/HTML-Entities.plist
+++ b/user-apps/Grr/Resources/Data/HTML-Entities.plist
@@ -68,6 +68,7 @@
      amp = 38;
      and = 8743;
      ang = 8736;
+     apos = 39;
      aring = 229;
      asymp = 8776;
      atilde = 227;
