diff --git a/framework/src/main/java/org/apache/felix/framework/BundleImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
index 36026f0..2a28114 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
@@ -297,7 +297,8 @@
             }
         }
 
-        return getFramework().findBundleEntries(this, path, filePattern, recurse);
+        return getFramework().findBundleEntries(
+            adapt(BundleRevision.class), path, filePattern, recurse);
     }
 
     public Dictionary getHeaders()
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
index 6cd132d..e55b990 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
@@ -76,7 +76,7 @@
     private final StatefulResolver m_resolver;
     private final BundleRevisionImpl m_revision;
     private final List<BundleRevision> m_fragments;
-// TODO: OSGi R,4.3 - Perhaps we should make m_wires and m_importedPkgs volatile
+// TODO: OSGi R4.3 - Perhaps we should make m_wires and m_importedPkgs volatile
 //       and copy-on-write instead of protecting them with object lock.
     private final List<BundleWire> m_wires;
     private final Map<String, BundleRevision> m_importedPkgs;
@@ -281,7 +281,7 @@
                 ? false : true;
     }
 
-    public void dispose()
+    public synchronized void dispose()
     {
         if (m_fragmentContents != null)
         {
@@ -464,7 +464,20 @@
 
     public List<URL> findEntries(String path, String filePattern, int options)
     {
-        throw new UnsupportedOperationException("Not supported yet.");
+        if (!Util.isFragment(m_revision))
+        {
+            Enumeration<URL> e =
+                ((BundleImpl) m_revision.getBundle()).getFramework()
+                    .findBundleEntries(m_revision, path, filePattern,
+                       (options & BundleWiring.FINDENTRIES_RECURSE) > 0);
+            List<URL> entries = new ArrayList<URL>();
+            while ((e != null) && e.hasMoreElements())
+            {
+                entries.add(e.nextElement());
+            }
+            return Collections.unmodifiableList(entries);
+        }
+        return Collections.EMPTY_LIST;
     }
 
     public Collection<String> listResources(String path, String filePattern, int options)
@@ -738,7 +751,7 @@
         return result;
     }
 
-    ClassLoader getBootDelegationClassLoader()
+    synchronized ClassLoader getBootDelegationClassLoader()
     {
         // Get the appropriate class loader for delegation.
         ClassLoader parent = (m_classLoader == null)
diff --git a/framework/src/main/java/org/apache/felix/framework/EntryFilterEnumeration.java b/framework/src/main/java/org/apache/felix/framework/EntryFilterEnumeration.java
index 9ebb2cf..76d5af0 100644
--- a/framework/src/main/java/org/apache/felix/framework/EntryFilterEnumeration.java
+++ b/framework/src/main/java/org/apache/felix/framework/EntryFilterEnumeration.java
@@ -22,12 +22,11 @@
 import java.net.URL;
 import java.util.*;
 import org.apache.felix.framework.capabilityset.SimpleFilter;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.wiring.BundleRevision;
 
 class EntryFilterEnumeration implements Enumeration
 {
-    private final Bundle m_bundle;
+    private final BundleRevision m_revision;
     private final List<Enumeration> m_enumerations;
     private final List<BundleRevision> m_revisions;
     private int m_revisionIndex = 0;
@@ -39,24 +38,23 @@
     private final List<Object> m_nextEntries = new ArrayList(2);
 
     public EntryFilterEnumeration(
-        Bundle bundle, boolean includeFragments, String path,
+        BundleRevision revision, boolean includeFragments, String path,
         String filePattern, boolean recurse, boolean isURLValues)
     {
-        m_bundle = bundle;
-        BundleRevision br = m_bundle.adapt(BundleRevision.class);
+        m_revision = revision;
         if (includeFragments
-            && (br.getWiring() != null)
-            && (((BundleWiringImpl) br.getWiring()).getFragments() != null))
+            && (m_revision.getWiring() != null)
+            && (((BundleWiringImpl) m_revision.getWiring()).getFragments() != null))
         {
             m_revisions = new ArrayList(
-                ((BundleWiringImpl) br.getWiring()).getFragments().size() + 1);
-            m_revisions.addAll(((BundleWiringImpl) br.getWiring()).getFragments());
+                ((BundleWiringImpl) m_revision.getWiring()).getFragments().size() + 1);
+            m_revisions.addAll(((BundleWiringImpl) m_revision.getWiring()).getFragments());
         }
         else
         {
             m_revisions = new ArrayList(1);
         }
-        m_revisions.add(0, br);
+        m_revisions.add(0, m_revision);
         m_enumerations = new ArrayList(m_revisions.size());
         for (int i = 0; i < m_revisions.size(); i++)
         {
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 8d5407e..4e5d173 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -1621,7 +1621,8 @@
             // Use the entry filter enumeration to search the bundle content
             // recursively for matching entries and return URLs to them.
             Enumeration enumeration =
-                new EntryFilterEnumeration(bundle, false, name, "*", true, true);
+                new EntryFilterEnumeration(
+                    bundle.adapt(BundleRevision.class), false, name, "*", true, true);
             // If the enumeration has elements, then that means we need
             // to synthesize the directory entry.
             if (enumeration.hasMoreElements())
@@ -1653,7 +1654,8 @@
         // Get the entry enumeration from the revision content and
         // create a wrapper enumeration to filter it.
         Enumeration enumeration =
-            new EntryFilterEnumeration(bundle, false, path, "*", false, false);
+            new EntryFilterEnumeration(
+                bundle.adapt(BundleRevision.class), false, path, "*", false, false);
 
         // Return the enumeration if it has elements.
         return (!enumeration.hasMoreElements()) ? null : enumeration;
@@ -1663,17 +1665,17 @@
      * Implementation for Bundle.findEntries().
     **/
     Enumeration findBundleEntries(
-        BundleImpl bundle, String path, String filePattern, boolean recurse)
+        BundleRevision revision, String path, String filePattern, boolean recurse)
     {
         // Try to resolve the bundle per the spec.
         List<Bundle> list = new ArrayList<Bundle>(1);
-        list.add(bundle);
+        list.add(revision.getBundle());
         resolveBundles(list);
 
         // Get the entry enumeration from the revision content and
         // create a wrapper enumeration to filter it.
         Enumeration enumeration =
-            new EntryFilterEnumeration(bundle, true, path, filePattern, recurse, true);
+            new EntryFilterEnumeration(revision, true, path, filePattern, recurse, true);
 
         // Return the enumeration if it has elements.
         return (!enumeration.hasMoreElements()) ? null : enumeration;
