Index: tika-parsers/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java
===================================================================
--- tika-parsers/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java	(revision 1085429)
+++ tika-parsers/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java	(working copy)
@@ -21,7 +21,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.mime.MediaType;
@@ -70,7 +70,7 @@
             assertEquals(
                     MediaType.parse("application/vnd.ms-powerpoint"),
                     detector.detect(stream, new Metadata()));
-            assertTrue(stream.getOpenContainer() instanceof POIFSFileSystem);
+            assertTrue(stream.getOpenContainer() instanceof NPOIFSFileSystem);
         } finally {
             stream.close();
         }
Index: tika-parsers/src/main/java/org/apache/tika/detect/POIFSContainerDetector.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/detect/POIFSContainerDetector.java	(revision 1085429)
+++ tika-parsers/src/main/java/org/apache/tika/detect/POIFSContainerDetector.java	(working copy)
@@ -28,7 +28,7 @@
 import java.util.Set;
 
 import org.apache.poi.poifs.filesystem.Entry;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.tika.io.CloseShieldInputStream;
 import org.apache.tika.io.TaggedInputStream;
 import org.apache.tika.io.TikaInputStream;
@@ -141,9 +141,13 @@
         TaggedInputStream tagged = new TaggedInputStream(
                 new BufferedInputStream(new FileInputStream(file)));
         try {
-            // POIFSFileSystem might try close the stream
-            POIFSFileSystem fs =
-                new POIFSFileSystem(new CloseShieldInputStream(tagged));
+            NPOIFSFileSystem fs;
+            if (stream.hasFile()) {
+               fs = new NPOIFSFileSystem(stream.getFile());
+            } else {
+               // Load from a stream, but prevent the stream being closed
+               fs = new NPOIFSFileSystem(new CloseShieldInputStream(tagged));
+            }
 
             // Optimize a possible later parsing process by keeping
             // a reference to the already opened POI file system
Index: tika-parsers/src/main/java/org/apache/tika/parser/microsoft/WordExtractor.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/parser/microsoft/WordExtractor.java	(revision 1085429)
+++ tika-parsers/src/main/java/org/apache/tika/parser/microsoft/WordExtractor.java	(working copy)
@@ -40,7 +40,7 @@
 import org.apache.poi.hwpf.usermodel.TableRow;
 import org.apache.poi.poifs.filesystem.DirectoryEntry;
 import org.apache.poi.poifs.filesystem.Entry;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.parser.ParseContext;
@@ -54,11 +54,11 @@
     }
 
     protected void parse(
-            POIFSFileSystem filesystem, XHTMLContentHandler xhtml)
+            NPOIFSFileSystem filesystem, XHTMLContentHandler xhtml)
             throws IOException, SAXException, TikaException {
         HWPFDocument document;
         try {
-            document = new HWPFDocument(filesystem);
+            document = new HWPFDocument(filesystem.getRoot());
         } catch(OldWordFileFormatException e) {
             parseWord6(filesystem, xhtml);
             return;
@@ -345,9 +345,9 @@
     }
     
     protected void parseWord6(
-            POIFSFileSystem filesystem, XHTMLContentHandler xhtml)
+            NPOIFSFileSystem filesystem, XHTMLContentHandler xhtml)
             throws IOException, SAXException, TikaException {
-        HWPFOldDocument doc = new HWPFOldDocument(filesystem);
+        HWPFOldDocument doc = new HWPFOldDocument(filesystem.getRoot());
         Word6Extractor extractor = new Word6Extractor(doc);
         
         for(String p : extractor.getParagraphText()) {
Index: tika-parsers/src/main/java/org/apache/tika/parser/microsoft/HSLFExtractor.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/parser/microsoft/HSLFExtractor.java	(revision 1085429)
+++ tika-parsers/src/main/java/org/apache/tika/parser/microsoft/HSLFExtractor.java	(working copy)
@@ -16,28 +16,29 @@
  */
 package org.apache.tika.parser.microsoft;
 
+import java.io.IOException;
+import java.util.List;
+
 import org.apache.poi.hslf.extractor.PowerPointExtractor;
 import org.apache.poi.hslf.model.OLEShape;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.xml.sax.SAXException;
 
-import java.io.IOException;
-import java.util.List;
-
 public class HSLFExtractor extends AbstractPOIFSExtractor {
     public HSLFExtractor(ParseContext context) {
         super(context);
     }
 
     protected void parse(
-            POIFSFileSystem filesystem, XHTMLContentHandler xhtml)
+            NPOIFSFileSystem filesystem, XHTMLContentHandler xhtml)
             throws IOException, SAXException, TikaException {
+        // TODO Tidy up with POI 3.8 beta 2
         PowerPointExtractor powerPointExtractor =
-            new PowerPointExtractor(filesystem);
+            new PowerPointExtractor(filesystem.getRoot(), null);
         xhtml.element("p", powerPointExtractor.getText(true, true));
 
         List<OLEShape> shapeList = powerPointExtractor.getOLEShapes();
Index: tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java	(revision 1085429)
+++ tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java	(working copy)
@@ -19,14 +19,21 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.GeneralSecurityException;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
 
+import org.apache.poi.hdgf.HDGFDiagram;
 import org.apache.poi.hdgf.extractor.VisioTextExtractor;
+import org.apache.poi.hpbf.HPBFDocument;
 import org.apache.poi.hpbf.extractor.PublisherTextExtractor;
 import org.apache.poi.poifs.crypt.Decryptor;
 import org.apache.poi.poifs.crypt.EncryptionInfo;
 import org.apache.poi.poifs.filesystem.DirectoryEntry;
 import org.apache.poi.poifs.filesystem.Entry;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
@@ -93,6 +100,10 @@
             return detectType(fs.getRoot());
         }
 
+        public static POIFSDocumentType detectType(NPOIFSFileSystem fs) {
+           return detectType(fs.getRoot());
+       }
+
         public static POIFSDocumentType detectType(DirectoryEntry node) {
             for (Entry entry : node) {
                 POIFSDocumentType type = detectType(entry);
@@ -152,12 +163,18 @@
         XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
         xhtml.startDocument();
 
-        POIFSFileSystem filesystem;
-        if(stream instanceof TikaInputStream && 
-        	((TikaInputStream)stream).getOpenContainer() != null) {
-            filesystem = (POIFSFileSystem)((TikaInputStream)stream).getOpenContainer();
+        NPOIFSFileSystem filesystem;
+        if(stream instanceof TikaInputStream) {
+            TikaInputStream tstream = (TikaInputStream)stream;
+        	   if(tstream.getOpenContainer() != null) {
+        	      filesystem = (NPOIFSFileSystem)tstream.getOpenContainer();
+        	   } else if(tstream.hasFile()) {
+        	      filesystem = new NPOIFSFileSystem(tstream.getFile());
+        	   } else {
+        	    filesystem = new NPOIFSFileSystem(tstream);
+        	   }
         } else {
-            filesystem = new POIFSFileSystem(stream);
+            filesystem = new NPOIFSFileSystem(stream);
         }
 
         // Parse summary entries first, to make metadata available early
@@ -174,8 +191,11 @@
 
             switch (type) {
                 case PUBLISHER:
+                    // TODO Tidy up when POI 3.8 beta 2 is out
+                    HPBFDocument pubDoc = new HPBFDocument(filesystem.getRoot(), null);
                     PublisherTextExtractor publisherTextExtractor =
-                        new PublisherTextExtractor(filesystem);
+                        new PublisherTextExtractor(pubDoc);
+//                        new PublisherTextExtractor(filesystem);
                     xhtml.element("p", publisherTextExtractor.getText());
                     break;
                 case WORDDOCUMENT:
@@ -189,8 +209,11 @@
                     new ExcelExtractor(context).parse(filesystem, xhtml, locale);
                     break;
                 case VISIO:
+                    // TODO Tidy up when POI 3.8 beta 2 is out
+                    HDGFDiagram visioDoc = new HDGFDiagram(filesystem.getRoot(), null);
                     VisioTextExtractor visioTextExtractor =
-                        new VisioTextExtractor(filesystem);
+                        new VisioTextExtractor(visioDoc);
+//                        new VisioTextExtractor(filesystem);
                     for (String text : visioTextExtractor.getAllText()) {
                         xhtml.element("p", text);
                     }
@@ -206,7 +229,12 @@
                     }
                     break;
                 case ENCRYPTED:
-                    EncryptionInfo info = new EncryptionInfo(filesystem);
+                    // TODO Tidy up when POI 3.8 beta 2 is out
+                    POIFSFileSystem tmp = new POIFSFileSystem();
+                    tmp.createDocument(filesystem.createDocumentInputStream("EncryptionInfo"), "EncryptionInfo");
+                    tmp.createDocument(filesystem.createDocumentInputStream("EncryptedPackage"), "EncryptedPackage");
+                    
+                    EncryptionInfo info = new EncryptionInfo(tmp);
                     Decryptor d = new Decryptor(info);
 
                     try {
@@ -216,7 +244,7 @@
 
                         OOXMLParser parser = new OOXMLParser();
 
-                        parser.parse(d.getDataStream(filesystem), new EmbeddedContentHandler(
+                        parser.parse(d.getDataStream(tmp), new EmbeddedContentHandler(
                                         new BodyContentHandler(xhtml)),
                                         metadata, context);
                     } catch (GeneralSecurityException ex) {
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 1085429)
+++ tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java	(working copy)
@@ -21,7 +21,7 @@
 import org.apache.poi.hsmf.MAPIMessage;
 import org.apache.poi.hsmf.datatypes.AttachmentChunks;
 import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
@@ -35,11 +35,12 @@
 public class OutlookExtractor extends AbstractPOIFSExtractor {
     private final MAPIMessage msg;
 
-    public OutlookExtractor(POIFSFileSystem filesystem, ParseContext context) throws TikaException {
+    public OutlookExtractor(NPOIFSFileSystem filesystem, ParseContext context) throws TikaException {
         super(context);
         
         try {
-            this.msg = new MAPIMessage(filesystem);
+            // TODO Tidy up when POI 3.8 beta 2 is out
+            this.msg = new MAPIMessage(filesystem.getRoot(), null);
         } catch (IOException e) {
             throw new TikaException("Failed to parse Outlook message", e);
         }
Index: tika-parsers/src/main/java/org/apache/tika/parser/microsoft/SummaryExtractor.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/parser/microsoft/SummaryExtractor.java	(revision 1085429)
+++ tika-parsers/src/main/java/org/apache/tika/parser/microsoft/SummaryExtractor.java	(working copy)
@@ -29,7 +29,7 @@
 import org.apache.poi.hpsf.UnexpectedPropertySetTypeException;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.DocumentInputStream;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.PagedText;
@@ -52,14 +52,14 @@
         this.metadata = metadata;
     }
 
-    public void parseSummaries(POIFSFileSystem filesystem)
+    public void parseSummaries(NPOIFSFileSystem filesystem)
             throws IOException, TikaException {
         parseSummaryEntryIfExists(filesystem, SUMMARY_INFORMATION);
         parseSummaryEntryIfExists(filesystem, DOCUMENT_SUMMARY_INFORMATION);
     }
 
     private void parseSummaryEntryIfExists(
-            POIFSFileSystem filesystem, String entryName)
+            NPOIFSFileSystem filesystem, String entryName)
             throws IOException, TikaException {
         try {
             DocumentEntry entry =
Index: tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ExcelExtractor.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ExcelExtractor.java	(revision 1085429)
+++ tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ExcelExtractor.java	(working copy)
@@ -59,7 +59,7 @@
 import org.apache.poi.poifs.filesystem.DirectoryEntry;
 import org.apache.poi.poifs.filesystem.DocumentInputStream;
 import org.apache.poi.poifs.filesystem.Entry;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.parser.ParseContext;
@@ -130,7 +130,7 @@
      * or writing the extracted content
      */
     protected void parse(
-            POIFSFileSystem filesystem, XHTMLContentHandler xhtml,
+            NPOIFSFileSystem filesystem, XHTMLContentHandler xhtml,
             Locale locale) throws IOException, SAXException, TikaException {
         TikaHSSFListener listener = new TikaHSSFListener(xhtml, locale, this);
         listener.processFile(filesystem, isListenForAllRecords());
@@ -243,7 +243,7 @@
          * @throws IOException on any IO errors.
          * @throws SAXException on any SAX parsing errors.
          */
-    	public void processFile(POIFSFileSystem filesystem, boolean listenForAllRecords)
+    	public void processFile(NPOIFSFileSystem filesystem, boolean listenForAllRecords)
     		throws IOException, SAXException, TikaException {
 
     		// Set up listener and register the records we want to process
