Index: impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/unit/MemoryMapArchiveTestCase.java
===================================================================
--- impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/unit/MemoryMapArchiveTestCase.java	(revision 3832)
+++ impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/unit/MemoryMapArchiveTestCase.java	(working copy)
@@ -16,8 +16,12 @@
  */
 package org.jboss.shrinkwrap.impl.base.unit;
 
+import java.util.logging.Logger;
+
 import junit.framework.Assert;
 
+import org.jboss.shrinkwrap.api.Archives;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.jboss.shrinkwrap.impl.base.MemoryMapArchiveImpl;
 import org.jboss.shrinkwrap.impl.base.ServiceExtensionLoader;
 import org.jboss.shrinkwrap.impl.base.test.ArchiveTestBase;
@@ -36,8 +40,25 @@
  */
 public class MemoryMapArchiveTestCase extends ArchiveTestBase<MemoryMapArchive>
 {
+   //-------------------------------------------------------------------------------------||
+   // Class Members ----------------------------------------------------------------------||
+   //-------------------------------------------------------------------------------------||
+   
+   /**
+    * Logger
+    */
+   private static final Logger log = Logger.getLogger(MemoryMapArchiveTestCase.class.getName());
+   
+   //-------------------------------------------------------------------------------------||
+   // Instance Members -------------------------------------------------------------------||
+   //-------------------------------------------------------------------------------------||
+   
    private MemoryMapArchive archive;
 
+   //-------------------------------------------------------------------------------------||
+   // Tests ------------------------------------------------------------------------------||
+   //-------------------------------------------------------------------------------------||
+
    /**
     * Create a new Archive instance per Test.
     * 
@@ -97,4 +118,9 @@
    {
       new MemoryMapArchiveImpl("test.jar", null);
    }
+   
+   @Test
+   public void testSorting(){
+      log.info(Archives.create("alr", JavaArchive.class).addClass(this.getClass()).toString(true));
+   }
 }
Index: impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExporterTestCase.java
===================================================================
--- impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExporterTestCase.java	(revision 3832)
+++ impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExporterTestCase.java	(working copy)
@@ -25,8 +25,6 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
-import junit.framework.TestCase;
-
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.Asset;
 import org.jboss.shrinkwrap.api.Path;
@@ -90,7 +88,7 @@
       // Validate all paths were written
       // SHRINKWRAP-94
       getEntryFromZip(expectedZip, NESTED_PATH);
-      
+
       // Ensure we don't write the root PAth
       // SHRINKWRAP-96
       ZipEntry rootEntry = expectedZip.getEntry("/");
@@ -245,36 +243,4 @@
       OutputStream fileOutputStream = new FileOutputStream(outFile);
       IOUtil.copyWithClose(inputStream, fileOutputStream);
    }
-
-   /**
-    * Ensures the contract of {@link PathProvider#parent()}
-    * is intact
-    */
-   @Test
-   public void testParent()
-   {
-      // Log
-      log.info("testParent");
-
-      // Create new paths
-      final String rootString = "/";
-      final String subpathString = "subpath";
-      final String contextString = "context";
-      final String context2String = "context/";
-      final BasicPath root = new BasicPath(rootString);
-      final BasicPath subpath = new BasicPath(subpathString);
-      final BasicPath context = new BasicPath(subpath, contextString);
-      final BasicPath contextWithFollowingSlash = new BasicPath(subpath, context2String);
-
-      // Test
-      TestCase.assertEquals("The parent of the context path should be equal to the initial subpath", subpath,
-            ZipExportDelegate.getParent(context));
-      TestCase.assertEquals(
-            "The parent of the context path with a following slash should be equal to the initial subpath", subpath,
-            ZipExportDelegate.getParent(contextWithFollowingSlash));
-      TestCase.assertEquals("The parent of the subpath should be the root", root, ZipExportDelegate.getParent(subpath));
-      TestCase.assertNull("The parent of the root should be null", ZipExportDelegate.getParent(root));
-
-   }
-
 }
Index: impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/path/PathUtilTestCase.java
===================================================================
--- impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/path/PathUtilTestCase.java	(revision 3832)
+++ impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/path/PathUtilTestCase.java	(working copy)
@@ -2,6 +2,8 @@
 
 import java.util.logging.Logger;
 
+import junit.framework.TestCase;
+
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -173,4 +175,35 @@
       Assert.assertEquals("Composing an absolute context from base and context did not succeed", expected, result);
    }
 
+   /**
+    * Ensures the contract of {@link PathUtil#parent()}
+    * is intact
+    */
+   @Test
+   public void testParent()
+   {
+      // Log
+      log.info("testParent");
+
+      // Create new paths
+      final String rootString = "/";
+      final String subpathString = "subpath";
+      final String contextString = "context";
+      final String context2String = "context/";
+      final BasicPath root = new BasicPath(rootString);
+      final BasicPath subpath = new BasicPath(subpathString);
+      final BasicPath context = new BasicPath(subpath, contextString);
+      final BasicPath contextWithFollowingSlash = new BasicPath(subpath, context2String);
+
+      // Test
+      TestCase.assertEquals("The parent of the context path should be equal to the initial subpath", subpath, PathUtil
+            .getParent(context));
+      TestCase.assertEquals(
+            "The parent of the context path with a following slash should be equal to the initial subpath", subpath,
+            PathUtil.getParent(contextWithFollowingSlash));
+      TestCase.assertEquals("The parent of the subpath should be the root", root, PathUtil.getParent(subpath));
+      TestCase.assertNull("The parent of the root should be null", PathUtil.getParent(root));
+
+   }
+
 }
Index: impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/MemoryMapArchiveBase.java
===================================================================
--- impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/MemoryMapArchiveBase.java	(revision 3832)
+++ impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/MemoryMapArchiveBase.java	(working copy)
@@ -17,9 +17,12 @@
 package org.jboss.shrinkwrap.impl.base;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -31,6 +34,7 @@
 import org.jboss.shrinkwrap.api.Path;
 import org.jboss.shrinkwrap.impl.base.asset.ArchiveAsset;
 import org.jboss.shrinkwrap.impl.base.path.BasicPath;
+import org.jboss.shrinkwrap.impl.base.path.PathUtil;
 
 /**
  * MemoryMapArchiveBase
@@ -217,7 +221,7 @@
          sb.append(this.getName()).append(COLON).append(NEWLINE);
 
          // Sort all paths
-         final List<Path> paths = new ArrayList<Path>(content.keySet());
+         final List<Path> paths = new ArrayList<Path>(this.getAllPathsAndParents());
          Collections.sort(paths);
 
          for (final Path path : paths)
@@ -229,7 +233,60 @@
       // Fall back on toString
       return this.toString();
    }
+   
+   /**
+    * Returns a set of all Paths (and parents)
+    * contained in this archive; internally we only store
+    * the full Path (given: "/path/to/asset").  This method will return
+    * "/path/to/" and "/path/" as part of the Set.
+    * 
+    * @return
+    */
+   Set<Path> getAllPathsAndParents()
+   {
 
+      // Get all contents
+      final Map<Path, Asset> contents = this.getContent();
+
+      // Loop through all stored paths
+      final Set<Path> paths = contents.keySet();
+      final Set<Path> pathsAndParents = new HashSet<Path>();
+      for (final Path path : paths)
+      {
+         // Add all parents as we go
+         pathsAndParents.addAll(this.getAllPathsAndParents(path));
+      }
+      // Return the merged view
+      return pathsAndParents;
+
+   }
+
+   /**
+    * Returns a set of all Paths (and parents)
+    * contained the Path specified; internally we only store
+    * the full Path (given: "/path/to/asset").  This method will return
+    * "/path/to/" and "/path/" as part of the Set.
+    * @param path, must be specified (not null)
+    * @return
+    */
+   Set<Path> getAllPathsAndParents(final Path path)
+   {
+      // Precondition checks
+      assert path != null : "Path must be specified";
+      // Initialize
+      final Set<Path> pathsAndParents = new HashSet<Path>();
+
+      // If we're not the root
+      final Path parent = PathUtil.getParent(path);
+      if (parent != null)
+      {
+         pathsAndParents.addAll(this.getAllPathsAndParents(parent));
+         pathsAndParents.add(path);
+      }
+
+      return pathsAndParents;
+   }
+
    //-------------------------------------------------------------------------------------||
    // Internal Helper Methods ------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
Index: impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/path/PathUtil.java
===================================================================
--- impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/path/PathUtil.java	(revision 3832)
+++ impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/path/PathUtil.java	(working copy)
@@ -17,6 +17,8 @@
  */
 package org.jboss.shrinkwrap.impl.base.path;
 
+import org.jboss.shrinkwrap.api.Path;
+
 /**
  * PathUtil
  * 
@@ -234,6 +236,35 @@
       return resolved;
    }
 
+   /**
+    * Obtains the parent of this Path, if exists, else null.
+    * For instance if the Path is "/my/path", the parent 
+    * will be "/my".  Each call will result in a new object reference,
+    * though subsequent calls upon the same Path will be equal by value.
+    * @return
+    * 
+    * @param path The path whose parent context we should return
+    */
+   public static Path getParent(final Path path)
+   {
+      // Precondition checks
+      assert path != null : "Path must be specified";
+
+      // Get the last index of "/"
+      final String resolvedContext = PathUtil.optionallyRemoveFollowingSlash(path.get());
+      final int lastIndex = resolvedContext.lastIndexOf(PathUtil.SLASH);
+      // If it either doesn't occur or is the root
+      if (lastIndex == -1 || (lastIndex == 0 && resolvedContext.length() == 1))
+      {
+         // No parent present, return null
+         return null;
+      }
+      // Get the parent context
+      final String sub = resolvedContext.substring(0, lastIndex);
+      // Return
+      return new BasicPath(sub);
+   }
+
    //-------------------------------------------------------------------------------------||
    // Internal Helper Methods ------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
Index: impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/path/BasicPath.java
===================================================================
--- impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/path/BasicPath.java	(revision 3832)
+++ impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/path/BasicPath.java	(working copy)
@@ -145,9 +145,30 @@
          return 1;
       }
 
-      // Just delegate to underlying Strings
-      return path.get().compareTo(this.get());
+      /*
+       * Check for parent relationship
+       */
+      final Path parentOfSpecified = PathUtil.getParent(path);
+      final Path parentOfThis = PathUtil.getParent(this);
+      // If we're the parent of the specified, we're less
+      if (this.equals(parentOfSpecified))
+      {
+         return -1;
+      }
+      // If the specified if the parent of us, we're more
+      if (path.equals(parentOfThis))
+      {
+         return 1;
+      }
+      
+      // Just delegate to underlying contexts
+      final int comparedContexts =path.get().compareTo(this.get());
+      
+      // Return the inverted value of the contents (in this ordering, less is more)
+      final int adjusted = 0 - comparedContexts;
+      return adjusted;
    }
+   
 
    //-------------------------------------------------------------------------------------||
    // Overridden Implementations ---------------------------------------------------------||
Index: impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExportDelegate.java
===================================================================
--- impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExportDelegate.java	(revision 3832)
+++ impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/exporter/ZipExportDelegate.java	(working copy)
@@ -33,7 +33,6 @@
 import org.jboss.shrinkwrap.impl.base.io.IOUtil;
 import org.jboss.shrinkwrap.impl.base.io.StreamErrorHandler;
 import org.jboss.shrinkwrap.impl.base.io.StreamTask;
-import org.jboss.shrinkwrap.impl.base.path.BasicPath;
 import org.jboss.shrinkwrap.impl.base.path.PathUtil;
 
 public class ZipExportDelegate extends AbstractExporterDelegate<InputStream>
@@ -132,12 +131,12 @@
        * by recursing first and adding parents that
        * haven't already been written.
        */
-      final Path parent = getParent(path);
+      final Path parent = PathUtil.getParent(path);
       if (parent != null && !this.pathsExported.contains(parent))
       {
          // If this is not the root
          // SHRINKWRAP-96
-         final Path grandParent = getParent(parent);
+         final Path grandParent = PathUtil.getParent(parent);
          final boolean isRoot = grandParent == null;
          if (!isRoot)
          {
@@ -217,38 +216,4 @@
       // Return
       return inputStream;
    }
-
-   //-------------------------------------------------------------------------------------||
-   // Internal Helper Methods ------------------------------------------------------------||
-   //-------------------------------------------------------------------------------------||
-
-   /**
-    * Obtains the parent of this Path, if exists, else null.
-    * For instance if the Path is "/my/path", the parent 
-    * will be "/my".  Each call will result in a new object reference,
-    * though subsequent calls upon the same Path will be equal by value.
-    * @return
-    * 
-    * @param path The path whose parent context we should return
-    */
-   static Path getParent(final Path path)
-   {
-      // Precondition checks
-      assert path != null : "Path must be specified";
-
-      // Get the last index of "/"
-      final String resolvedContext = PathUtil.optionallyRemoveFollowingSlash(path.get());
-      final int lastIndex = resolvedContext.lastIndexOf(PathUtil.SLASH);
-      // If it either doesn't occur or is the root
-      if (lastIndex == -1 || (lastIndex == 0 && resolvedContext.length() == 1))
-      {
-         // No parent present, return null
-         return null;
-      }
-      // Get the parent context
-      final String sub = resolvedContext.substring(0, lastIndex);
-      // Return
-      return new BasicPath(sub);
-   }
-
 }
