diff --git a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
index 3806787..b235a2e 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
@@ -142,6 +142,13 @@
         List contentList = new ArrayList();
         for (int i = 0; i < classPathStrings.length; i++)
         {
+            // Remove any leading slash, since all bundle class path
+            // entries are relative to the root of the bundle.
+            classPathStrings[i] = (classPathStrings[i].startsWith("/"))
+                ? classPathStrings[i].substring(1)
+                : classPathStrings[i];
+
+            // Check for the bundle itself on the class path.
             if (classPathStrings[i].equals(FelixConstants.CLASS_PATH_DOT))
             {
                 contentList.add(self);
@@ -194,4 +201,4 @@
         // of the revision directory, which will be automatically deleted
         // by the parent bundle archive.
     }
-}
+}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java b/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
index 12c08fe..76b8763 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
@@ -161,6 +161,13 @@
             List contentList = new ArrayList();
             for (int i = 0; i < classPathStrings.length; i++)
             {
+                // Remove any leading slash, since all bundle class path
+                // entries are relative to the root of the bundle.
+                classPathStrings[i] = (classPathStrings[i].startsWith("/"))
+                    ? classPathStrings[i].substring(1)
+                    : classPathStrings[i];
+
+                // Check for the bundle itself on the class path.
                 if (classPathStrings[i].equals(FelixConstants.CLASS_PATH_DOT))
                 {
                     contentList.add(self);
diff --git a/framework/src/main/java/org/apache/felix/moduleloader/ContentDirectoryContent.java b/framework/src/main/java/org/apache/felix/moduleloader/ContentDirectoryContent.java
index 7290ab4..1aa0674 100644
--- a/framework/src/main/java/org/apache/felix/moduleloader/ContentDirectoryContent.java
+++ b/framework/src/main/java/org/apache/felix/moduleloader/ContentDirectoryContent.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Enumeration;
+import java.util.NoSuchElementException;
 
 public class ContentDirectoryContent implements IContent
 {
@@ -133,25 +134,44 @@
     {
         private Enumeration m_enumeration = null;
         private String m_rootPath = null;
+        private String m_nextEntry = null;
 
         public EntriesEnumeration(Enumeration enumeration, String rootPath)
         {
             m_enumeration = enumeration;
             m_rootPath = rootPath;
+            m_nextEntry = findNextEntry();
         }
 
         public boolean hasMoreElements()
         {
-            return m_enumeration.hasMoreElements();
+            return (m_nextEntry != null);
         }
 
         public Object nextElement()
         {
-            // We need to treat the specified path as the root of the
-            // content, so we need to strip off the leading path from
-            // each entry because it is automatically added back on
-            // in the other calls above.
-            return ((String) m_enumeration.nextElement()).substring(m_rootPath.length());
+            if (m_nextEntry == null)
+            {
+                throw new NoSuchElementException("No more elements.");
+            }
+            String currentEntry = m_nextEntry;
+            m_nextEntry = findNextEntry();
+            return currentEntry;
+        }
+
+        private String findNextEntry()
+        {
+            // Find next entry that is inside the root directory.
+            while (m_enumeration.hasMoreElements())
+            {
+                String next = (String) m_enumeration.nextElement();
+                if (next.startsWith(m_rootPath) && !next.equals(m_rootPath))
+                {
+                    // Strip off the root directory.
+                    return next.substring(m_rootPath.length());
+                }
+            }
+            return null;
         }
     }
 }
\ No newline at end of file
