Index: src/test/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExporterTestCase.java
===================================================================
--- src/test/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExporterTestCase.java	(revision 3931)
+++ src/test/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExporterTestCase.java	(working copy)
@@ -28,8 +28,8 @@
 import junit.framework.TestCase;
 
 import org.jboss.shrinkwrap.api.Archive;
-import org.jboss.shrinkwrap.api.Asset;
 import org.jboss.shrinkwrap.api.ArchivePath;
+import org.jboss.shrinkwrap.api.Asset;
 import org.jboss.shrinkwrap.api.exporter.ArchiveExportException;
 import org.jboss.shrinkwrap.api.exporter.FileExistsException;
 import org.jboss.shrinkwrap.api.exporter.ZipExporter;
@@ -214,7 +214,6 @@
 
       archive.add(new Asset()
       {
-
          @Override
          public InputStream openStream()
          {
Index: src/main/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExportDelegate.java
===================================================================
--- src/main/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExportDelegate.java	(revision 3931)
+++ src/main/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExportDelegate.java	(working copy)
@@ -16,11 +16,16 @@
  */
 package org.jboss.shrinkwrap.impl.base.exporter;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.zip.ZipEntry;
@@ -28,8 +33,8 @@
 import java.util.zip.ZipOutputStream;
 
 import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ArchivePath;
 import org.jboss.shrinkwrap.api.Asset;
-import org.jboss.shrinkwrap.api.ArchivePath;
 import org.jboss.shrinkwrap.api.exporter.ArchiveExportException;
 import org.jboss.shrinkwrap.impl.base.asset.DirectoryAsset;
 import org.jboss.shrinkwrap.impl.base.io.IOUtil;
@@ -48,16 +53,31 @@
     */
    private static final Logger log = Logger.getLogger(ZipExportDelegate.class.getName());
 
+   /**
+    * Services used to submit new jobs (encoding occurs in a separate Thread)
+    */
+   private static final ExecutorService service;
+   static
+   {
+      service = Executors.newCachedThreadPool();
+   }
+
    //-------------------------------------------------------------------------------------||
    // Instance Members -------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
 
    /**
-    * OutputStream to hold the output contents
+    * The stream returned to the caller; obtains its contents piped from the OutStream
     */
-   private final ByteArrayOutputStream output = new ByteArrayOutputStream(8192);
+   private final PipedInputStream input = new PipedInputStream();
 
    /**
+    * OutputStream which will be associated with the returned InStream, and the 
+    * chained IO point for the Zip OutStrea,
+    */
+   private final OutputStream output;
+
+   /**
     * ZipOutputStream used to write the zip entries
     */
    private ZipOutputStream zipOutputStream;
@@ -78,6 +98,14 @@
    public ZipExportDelegate(Archive<?> archive)
    {
       super(archive);
+      try
+      {
+         output = new PipedOutputStream(input);
+      }
+      catch (final IOException e)
+      {
+         throw new RuntimeException("Error in setting up output stream", e);
+      }
    }
 
    //-------------------------------------------------------------------------------------||
@@ -92,25 +120,25 @@
    protected void export()
    {
       zipOutputStream = new ZipOutputStream(output);
-      // Enclose every IO Operation so we can close up cleanly
-      IOUtil.closeOnComplete(zipOutputStream, new StreamTask<ZipOutputStream>()
+
+      // Submit the task to operate in another Thread so we can pipe the output to an InStream
+      service.submit(new Callable<Void>()
       {
 
          @Override
-         public void execute(ZipOutputStream stream) throws Exception
+         public Void call() throws Exception
          {
             ZipExportDelegate.super.export();
+            try
+            {
+               zipOutputStream.close();
+            }
+            catch (final IOException ioe)
+            {
+               // Ignore
+            }
+            return null;
          }
-
-      }, new StreamErrorHandler()
-      {
-
-         @Override
-         public void handle(Throwable t)
-         {
-            throw new ArchiveExportException("Failed to export Zip: " + getArchive().getName(), t);
-         }
-
       });
    }
 
@@ -127,11 +155,11 @@
          throw new IllegalArgumentException("Path must be specified");
       }
 
-      if(isParentOfAnyPathsExported(path))
+      if (isParentOfAnyPathsExported(path))
       {
          return;
       }
-      
+
       /*
        * SHRINKWRAP-94
        * Add entries for all parents of this Path
@@ -179,12 +207,13 @@
                final ZipEntry entry = new ZipEntry(resolvedPath);
 
                // Write the Asset under the same Path name in the Zip
-               try{
+               try
+               {
                   zipOutputStream.putNextEntry(entry);
                }
-               catch(final ZipException ze)
+               catch (final ZipException ze)
                {
-                  log.log(Level.SEVERE,pathsExported.toString());
+                  log.log(Level.SEVERE, pathsExported.toString());
                   throw new RuntimeException(ze);
                }
 
@@ -221,20 +250,9 @@
    @Override
    protected InputStream getResult()
    {
-      // Flush the output to a byte array
-      final byte[] zipContent = output.toByteArray();
-      if (log.isLoggable(Level.FINE))
-      {
-         log.fine("Created Zip of size: " + zipContent.length + " bytes");
-      }
+      return input;
+   }
 
-      // Make an instream
-      final InputStream inputStream = new ByteArrayInputStream(zipContent);
-
-      // Return
-      return inputStream;
-   }
-   
    /**
     * Returns whether or not this Path is a parent of any Paths exported 
     * @param path
@@ -244,35 +262,37 @@
    private boolean isParentOfAnyPathsExported(final ArchivePath path)
    {
       // For all Paths already exported
-      for(final ArchivePath exportedPath :this.pathsExported)
+      for (final ArchivePath exportedPath : this.pathsExported)
       {
-         if( this.isParentOfSpecifiedHierarchy(path, exportedPath)){
+         if (this.isParentOfSpecifiedHierarchy(path, exportedPath))
+         {
             return true;
          }
       }
-      
+
       return false;
    }
-   
+
    /**
     * 
     * @param path
     * @param compare
     * @return
     */
-   private boolean isParentOfSpecifiedHierarchy(final ArchivePath path,final ArchivePath compare){
+   private boolean isParentOfSpecifiedHierarchy(final ArchivePath path, final ArchivePath compare)
+   {
       // If we've reached the root, we're not a parent of any paths already exported
       final ArchivePath parent = PathUtil.getParent(compare);
-      if(parent==null)
+      if (parent == null)
       {
          return false;
       }
       // If equal to me, yes
-      if(path.equals(compare))
+      if (path.equals(compare))
       {
          return true;
       }
-      
+
       // Check my parent
       return this.isParentOfSpecifiedHierarchy(path, parent);
    }
