Index: tika-parsers/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java
===================================================================
--- tika-parsers/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java	(revision 1090261)
+++ tika-parsers/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java	(working copy)
@@ -17,9 +17,15 @@
 package org.apache.tika.parser.microsoft;
 
 import java.io.InputStream;
+import java.io.StringWriter;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
+
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
@@ -127,5 +133,39 @@
         assertTrue(content.contains("Streamlined Mail Experience"));
         assertTrue(content.contains("Navigation Pane"));
     }
+     
+    public void testOutlookHTMLVersion() throws Exception {
+        Parser parser = new AutoDetectParser();
+        Metadata metadata = new Metadata();
+       
+        // Check the HTML version
+        StringWriter sw = new StringWriter();
+        SAXTransformerFactory factory = (SAXTransformerFactory)
+                 SAXTransformerFactory.newInstance();
+        TransformerHandler handler = factory.newTransformerHandler();
+        handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "xml");
+        handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes");
+        handler.setResult(new StreamResult(sw));
 
+        InputStream stream = OutlookParserTest.class.getResourceAsStream(
+               "/test-documents/testMSG_chinese.msg");
+        try {
+           parser.parse(stream, handler, metadata, new ParseContext());
+        } finally {
+           stream.close();
+        }
+         
+        // As the HTML version should have been processed, ensure
+        //  we got some of the links
+        String content = sw.toString();
+        assertTrue(content.contains("<dd>tests.chang@fengttt.com</dd>"));
+        assertTrue(content.contains("<p>Alfresco MSG format testing"));
+        assertTrue(content.contains("<li>1"));
+        assertTrue(content.contains("<li>2"));
+        
+        // Make sure we don't have nested html docs
+        assertEquals(2, content.split("<body>").length);
+        //assertEquals(2, content.split("<\\/body>").length); // TODO Fix
+    }
+
 }
Index: tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java	(revision 1091042)
+++ tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java	(working copy)
@@ -36,6 +36,8 @@
 import org.apache.tika.parser.html.HtmlParser;
 import org.apache.tika.parser.rtf.RTFParser;
 import org.apache.tika.parser.txt.CharsetDetector;
+import org.apache.tika.parser.txt.CharsetMatch;
+import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.xml.sax.SAXException;
 
@@ -49,7 +51,7 @@
         super(context);
         
         try {
-            this.msg = new MAPIMessage(filesystem);
+            this.msg = new MAPIMessage(filesystem.getRoot());
         } catch (IOException e) {
             throw new TikaException("Failed to parse Outlook message", e);
         }
@@ -62,27 +64,22 @@
            
            // If the message contains strings that aren't stored
            //  as Unicode, try to sort out an encoding for them
-           // TODO Use new method
-           boolean hasNonUnicodeStrings = false;
-           for(Chunk chunk : msg.getMainChunks().getAll()) {
-              if(chunk instanceof StringChunk) {
-                 StringChunk sc = (StringChunk)chunk;
-                 if(sc.getType() == Types.ASCII_STRING) {
-                    hasNonUnicodeStrings = true;
-                    break;
-                 }
-              }
-           }
-           
-           if(hasNonUnicodeStrings) {
+           if(msg.has7BitEncodingStrings()) {
               if(msg.getHeaders() != null) {
                  // There's normally something in the headers
                  msg.guess7BitEncoding();
               } else {
                  // Nothing in the header, try encoding detection
                  //  on the message body
-                 CharsetDetector detector = new CharsetDetector();
-                 // TODO detect and use this
+                 StringChunk text = msg.getMainChunks().textBodyChunk; 
+                 if(text != null) {
+                    CharsetDetector detector = new CharsetDetector();
+                    detector.setText( text.getRawValue() );
+                    CharsetMatch match = detector.detect();
+                    if(match.getConfidence() > 35) {
+                       msg.set7BitEncoding( match.getName() );
+                    }
+                 }
               }
            }
            
@@ -169,13 +166,14 @@
               if(htmlChunk instanceof ByteChunk) {
                  data = ((ByteChunk)htmlChunk).getValue();
               } else if(htmlChunk instanceof StringChunk) {
-                 // TODO Needs POI 3.8 beta 3
+                 data = ((StringChunk)htmlChunk).getRawValue();
               }
               if(data != null) {
                  HtmlParser htmlParser = new HtmlParser();
                  htmlParser.parse(
                        new ByteArrayInputStream(data),
-                       xhtml, new Metadata(), new ParseContext()
+                       new BodyContentHandler(xhtml), 
+                       new Metadata(), new ParseContext()
                  );
                  doneBody = true;
               }
