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 2d7a7b4..964afbc 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
@@ -326,7 +326,7 @@
         if (locale.length() == 0)
         {
             result = new StringMap(
-                ((BundleRevisionImpl) getCurrentRevision()).getHeaders(), false);
+                ((BundleRevisionImpl) adapt(BundleRevision.class)).getHeaders(), false);
         }
 
         // If we have no result, try to get it from the cached headers.
@@ -363,7 +363,7 @@
         {
             // Get a modifiable copy of the raw headers.
             Map headers = new StringMap(
-                ((BundleRevisionImpl) getCurrentRevision()).getHeaders(), false);
+                ((BundleRevisionImpl) adapt(BundleRevision.class)).getHeaders(), false);
             // Assume for now that this will be the result.
             result = headers;
 
@@ -395,7 +395,7 @@
                 // Create ordered list of revisions to search for localization
                 // property resources.
                 List<BundleRevision> revisionList = createLocalizationRevisionList(
-                    (BundleRevisionImpl) getCurrentRevision());
+                    (BundleRevisionImpl) adapt(BundleRevision.class));
 
                 // Create ordered list of files to load properties from
                 List<String> resourceList = createLocalizationResourceList(basename, locale);
@@ -871,12 +871,12 @@
 
     public String getSymbolicName()
     {
-        return getCurrentRevision().getSymbolicName();
+        return adapt(BundleRevision.class).getSymbolicName();
     }
 
     public Version getVersion()
     {
-        return getCurrentRevision().getVersion();
+        return adapt(BundleRevision.class).getVersion();
     }
 
     public boolean hasPermission(Object obj)
@@ -1008,9 +1008,13 @@
             return (A) getFramework().adapt(FrameworkStartLevelImpl.class)
                 .createBundleStartLevel(this);
         }
+        else if (type == BundleRevision.class)
+        {
+            return (A) m_revisions.get(m_revisions.size() - 1);
+        }
         else if (type == BundleWiring.class)
         {
-            return (A) getCurrentRevision().getWiring();
+            return (A) m_revisions.get(m_revisions.size() - 1).getWiring();
         }
         return null;
     }
@@ -1027,7 +1031,7 @@
 
     public String toString()
     {
-        String sym = getCurrentRevision().getSymbolicName();
+        String sym = adapt(BundleRevision.class).getSymbolicName();
         if (sym != null)
         {
             return sym + " [" + getBundleId() +"]";
@@ -1079,16 +1083,6 @@
         return false;
     }
 
-    /**
-     * Returns the newest module, which corresponds to the last module
-     * in the module array.
-     * @return the newest module.
-    **/
-    synchronized BundleRevision getCurrentRevision()
-    {
-        return m_revisions.get(m_revisions.size() - 1);
-    }
-
     synchronized void revise(String location, InputStream is)
         throws Exception
     {
@@ -1191,7 +1185,7 @@
                 {
                     String sym = bundles[i].getSymbolicName();
                     Version ver = ((BundleRevisionImpl)
-                        ((BundleImpl) bundles[i]).getCurrentRevision()).getVersion();
+                        bundles[i].adapt(BundleRevision.class)).getVersion();
                     if ((symName != null) && (sym != null) && symName.equals(sym) && bundleVersion.equals(ver))
                     {
                         throw new BundleException(
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java b/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
index 8e424ee..eda9f21 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
@@ -42,20 +42,20 @@
         super(
             new CodeSource(
                 Felix.m_secureAction.createURL(
-                    Felix.m_secureAction.createURL(null, "location:", new FakeURLStreamHandler()), 
+                    Felix.m_secureAction.createURL(null, "location:", new FakeURLStreamHandler()),
                     bundle._getLocation(),
                     new FakeURLStreamHandler()
-                    ), 
-                (Certificate[]) null), 
+                    ),
+                (Certificate[]) null),
             null);
         m_felix = new WeakReference(felix);
         m_bundle = new WeakReference(bundle);
-        m_revision = new WeakReference(bundle.getCurrentRevision());
+        m_revision = new WeakReference(bundle.adapt(BundleRevision.class));
         m_hashCode = bundle.hashCode();
         m_toString = "[" + bundle + "]";
     }
 
-    BundleRevision getRevision() 
+    BundleRevision getRevision()
     {
         return (BundleRevision) m_revision.get();
     }
@@ -63,14 +63,14 @@
     public boolean implies(Permission permission)
     {
         Felix felix = (Felix) m_felix.get();
-        return (felix != null) ? 
+        return (felix != null) ?
             felix.impliesBundlePermission(this, permission, false) : false;
     }
 
     public boolean impliesDirect(Permission permission)
     {
         Felix felix = (Felix) m_felix.get();
-        return (felix != null) ? 
+        return (felix != null) ?
             felix.impliesBundlePermission(this, permission, true) : false;
     }
 
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
index 8ac2d61..0341468 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
@@ -355,7 +355,7 @@
     public boolean isRemovalPending()
     {
         return (m_bundle.getState() == Bundle.UNINSTALLED)
-            || (this != ((BundleImpl) m_bundle).getCurrentRevision());
+            || (this != m_bundle.adapt(BundleRevision.class));
     }
 
     //
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 1326b4a..a1a45cd 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
@@ -319,7 +319,7 @@
 
     public boolean isCurrent()
     {
-        return (((BundleImpl) m_revision.getBundle()).getCurrentRevision() == m_revision);
+        return (m_revision.getBundle().adapt(BundleRevision.class) == m_revision);
     }
 
     public boolean isInUse()
@@ -1519,8 +1519,8 @@
 
                                 int activationPolicy =
                                     ((BundleImpl) getBundle()).isDeclaredActivationPolicyUsed()
-                                    ? ((BundleRevisionImpl) ((BundleImpl) getBundle())
-                                        .getCurrentRevision()).getDeclaredActivationPolicy()
+                                    ? ((BundleRevisionImpl) getBundle()
+                                        .adapt(BundleRevision.class)).getDeclaredActivationPolicy()
                                     : EAGER_ACTIVATION;
 
                                 // If the revision is using deferred activation, then if
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 6c0ff80..9ebb2cf 100644
--- a/framework/src/main/java/org/apache/felix/framework/EntryFilterEnumeration.java
+++ b/framework/src/main/java/org/apache/felix/framework/EntryFilterEnumeration.java
@@ -22,11 +22,12 @@
 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 BundleImpl m_bundle;
+    private final Bundle m_bundle;
     private final List<Enumeration> m_enumerations;
     private final List<BundleRevision> m_revisions;
     private int m_revisionIndex = 0;
@@ -38,11 +39,11 @@
     private final List<Object> m_nextEntries = new ArrayList(2);
 
     public EntryFilterEnumeration(
-        BundleImpl bundle, boolean includeFragments, String path,
+        Bundle bundle, boolean includeFragments, String path,
         String filePattern, boolean recurse, boolean isURLValues)
     {
         m_bundle = bundle;
-        BundleRevision br = m_bundle.getCurrentRevision();
+        BundleRevision br = m_bundle.adapt(BundleRevision.class);
         if (includeFragments
             && (br.getWiring() != null)
             && (((BundleWiringImpl) br.getWiring()).getFragments() != null))
diff --git a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
index 9561f7f..4b6a368 100644
--- a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
+++ b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
@@ -304,7 +304,7 @@
         }
 
         String directive = ManifestParser.parseExtensionBundleHeader((String)
-            ((BundleRevisionImpl) bundle.getCurrentRevision())
+            ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                 .getHeaders().get(Constants.FRAGMENT_HOST));
 
         // We only support classpath extensions (not bootclasspath).
@@ -323,7 +323,7 @@
             {
                 exports = ManifestParser.parseExportHeader(
                     m_logger, m_systemBundleRevision,
-                    (String) ((BundleRevisionImpl) bundle.getCurrentRevision())
+                    (String) ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                         .getHeaders().get(Constants.EXPORT_PACKAGE),
                     m_systemBundleRevision.getSymbolicName(), m_systemBundleRevision.getVersion());
                 exports = aliasSymbolicName(exports);
@@ -334,7 +334,7 @@
                     bundle,
                     Logger.LOG_ERROR,
                     "Error parsing extension bundle export statement: "
-                    + ((BundleRevisionImpl) bundle.getCurrentRevision())
+                    + ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                         .getHeaders().get(Constants.EXPORT_PACKAGE), ex);
                 return;
             }
@@ -377,7 +377,7 @@
     void startExtensionBundle(Felix felix, BundleImpl bundle)
     {
         String activatorClass = (String)
-            ((BundleRevisionImpl) bundle.getCurrentRevision())
+            ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                 .getHeaders().get(FelixConstants.FELIX_EXTENSION_ACTIVATOR);
 
         if (activatorClass != null)
@@ -506,8 +506,8 @@
         {
             try
             {
-                result = ((BundleRevisionImpl) ((BundleImpl)
-                    extBundle).getCurrentRevision()).getResourceLocal(path);
+                result = ((BundleRevisionImpl)
+                    extBundle.adapt(BundleRevision.class)).getResourceLocal(path);
             }
             catch (Exception ex)
             {
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 ab9a644..35269bc 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -683,7 +683,7 @@
                 // state to be set to RESOLVED.
                 try
                 {
-                    m_resolver.resolve(getCurrentRevision());
+                    m_resolver.resolve(adapt(BundleRevision.class));
                 }
                 catch (ResolveException ex)
                 {
@@ -1527,7 +1527,7 @@
         {
             throw new IllegalStateException("The bundle is uninstalled.");
         }
-        else if (Util.isFragment(bundle.getCurrentRevision()))
+        else if (Util.isFragment(bundle.adapt(BundleRevision.class)))
         {
             return null;
         }
@@ -1536,14 +1536,14 @@
 //       searching if it fails. Perhaps we should attempt the resolve here
 //       and do the local searching here. This means we could get rid of
 //       resolve attempts in findClassOrResourceByDelegation().
-        if (bundle.getCurrentRevision().getWiring() == null)
+        if (bundle.adapt(BundleRevision.class).getWiring() == null)
         {
-            return ((BundleRevisionImpl) bundle.getCurrentRevision())
+            return ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                 .getResourceLocal(name);
         }
         else
         {
-            return ((BundleWiringImpl) bundle.getCurrentRevision().getWiring())
+            return ((BundleWiringImpl) bundle.adapt(BundleRevision.class).getWiring())
                 .getResourceByDelegation(name);
         }
     }
@@ -1557,7 +1557,7 @@
         {
             throw new IllegalStateException("The bundle is uninstalled.");
         }
-        else if (Util.isFragment(bundle.getCurrentRevision()))
+        else if (Util.isFragment(bundle.adapt(BundleRevision.class)))
         {
             return null;
         }
@@ -1566,14 +1566,14 @@
 //       searching if it fails. Perhaps we should attempt the resolve here
 //       and do the local searching here. This means we could get rid of
 //       resolve attempts in findResourcesByDelegation().
-        if (bundle.getCurrentRevision().getWiring() == null)
+        if (bundle.adapt(BundleRevision.class).getWiring() == null)
         {
-            return ((BundleRevisionImpl) bundle.getCurrentRevision())
+            return ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                 .getResourcesLocal(name);
         }
         else
         {
-            return ((BundleWiringImpl) bundle.getCurrentRevision().getWiring())
+            return ((BundleWiringImpl) bundle.adapt(BundleRevision.class).getWiring())
                 .getResourcesByDelegation(name);
         }
     }
@@ -1588,7 +1588,7 @@
             throw new IllegalStateException("The bundle is uninstalled.");
         }
 
-        URL url = ((BundleRevisionImpl) bundle.getCurrentRevision()).getEntry(name);
+        URL url = ((BundleRevisionImpl) bundle.adapt(BundleRevision.class)).getEntry(name);
 
         // Some JAR files do not contain directory entries, so if
         // the entry wasn't found and is a directory, scan the entries
@@ -1718,7 +1718,7 @@
         {
             throw new IllegalStateException("Bundle is uninstalled");
         }
-        else if (Util.isFragment(bundle.getCurrentRevision()))
+        else if (Util.isFragment(bundle.adapt(BundleRevision.class)))
         {
             throw new ClassNotFoundException("Fragments cannot load classes.");
         }
@@ -1737,7 +1737,7 @@
             }
         }
         return ((BundleWiringImpl)
-            bundle.getCurrentRevision().getWiring()).getClassByDelegation(name);
+            bundle.adapt(BundleRevision.class).getWiring()).getClassByDelegation(name);
     }
 
     /**
@@ -1776,7 +1776,7 @@
 
         // Record whether the bundle is using its declared activation policy.
         boolean wasDeferred = bundle.isDeclaredActivationPolicyUsed()
-            && (((BundleRevisionImpl) bundle.getCurrentRevision())
+            && (((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                 .getDeclaredActivationPolicy() == BundleRevisionImpl.LAZY_ACTIVATION);
         bundle.setDeclaredActivationPolicyUsed(
             (options & Bundle.START_ACTIVATION_POLICY) != 0);
@@ -1793,7 +1793,7 @@
 
             // As per the OSGi spec, fragment bundles can not be started and must
             // throw a BundleException when there is an attempt to start one.
-            if (Util.isFragment(bundle.getCurrentRevision()))
+            if (Util.isFragment(bundle.adapt(BundleRevision.class)))
             {
                 throw new BundleException("Fragment bundles can not be started.");
             }
@@ -1898,9 +1898,9 @@
             // If the bundle's activation policy is eager or activation has already
             // been triggered, then activate the bundle immediately.
             if (!bundle.isDeclaredActivationPolicyUsed()
-                || (((BundleRevisionImpl) bundle.getCurrentRevision())
+                || (((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                     .getDeclaredActivationPolicy() != BundleRevisionImpl.LAZY_ACTIVATION)
-                || ((BundleWiringImpl) bundle.getCurrentRevision().getWiring())
+                || ((BundleWiringImpl) bundle.adapt(BundleRevision.class).getWiring())
                     .isActivationTriggered())
             {
                 // Record the event type for the final event and activate.
@@ -2090,7 +2090,7 @@
 
             // First get the update-URL from our header.
             String updateLocation = (String)
-                ((BundleRevisionImpl) bundle.getCurrentRevision())
+                ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                     .getHeaders().get(Constants.BUNDLE_UPDATELOCATION);
 
             // If no update location specified, use original location.
@@ -2231,7 +2231,8 @@
 
             // If the old state was active, but the new revision is a fragment,
             // then mark the persistent state to inactive.
-            if ((oldState == Bundle.ACTIVE) && Util.isFragment(bundle.getCurrentRevision()))
+            if ((oldState == Bundle.ACTIVE)
+                && Util.isFragment(bundle.adapt(BundleRevision.class)))
             {
                 bundle.setPersistentStateInactive();
                 m_logger.log(bundle, Logger.LOG_WARNING,
@@ -2324,7 +2325,7 @@
 
             // As per the OSGi spec, fragment bundles can not be stopped and must
             // throw a BundleException when there is an attempt to stop one.
-            if (Util.isFragment(bundle.getCurrentRevision()))
+            if (Util.isFragment(bundle.adapt(BundleRevision.class)))
             {
                 throw new BundleException("Fragment bundles can not be stopped: " + bundle);
             }
@@ -2336,7 +2337,7 @@
                     throw new IllegalStateException("Cannot stop an uninstalled bundle.");
                 case Bundle.STARTING:
                     if (bundle.isDeclaredActivationPolicyUsed()
-                        && ((BundleRevisionImpl) bundle.getCurrentRevision())
+                        && ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                             .getDeclaredActivationPolicy() != BundleRevisionImpl.LAZY_ACTIVATION)
                     {
                         throw new BundleException(
@@ -3682,11 +3683,11 @@
         }
     }
 
-    private void resolveBundle(BundleImpl bundle) throws BundleException
+    private void resolveBundle(Bundle bundle) throws BundleException
     {
         try
         {
-            m_resolver.resolve(bundle.getCurrentRevision());
+            m_resolver.resolve(bundle.adapt(BundleRevision.class));
         }
         catch (ResolveException ex)
         {
@@ -4016,7 +4017,7 @@
         return true;
     }
 
-    private BundleActivator createBundleActivator(BundleImpl impl)
+    private BundleActivator createBundleActivator(Bundle impl)
         throws Exception
     {
         // CONCURRENCY NOTE:
@@ -4025,7 +4026,7 @@
 
         // Get the activator class from the header map.
         BundleActivator activator = null;
-        Map headerMap = ((BundleRevisionImpl) impl.getCurrentRevision()).getHeaders();
+        Map headerMap = ((BundleRevisionImpl) impl.adapt(BundleRevision.class)).getHeaders();
         String className = (String) headerMap.get(Constants.BUNDLE_ACTIVATOR);
         // Try to instantiate activator class if present.
         if (className != null)
@@ -4035,7 +4036,7 @@
             try
             {
                 clazz = ((BundleWiringImpl)
-                    impl.getCurrentRevision().getWiring()).getClassByDelegation(className);
+                    impl.adapt(BundleRevision.class).getWiring()).getClassByDelegation(className);
             }
             catch (ClassNotFoundException ex)
             {
diff --git a/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java b/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
index b884ec9..e1f1e70 100644
--- a/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
@@ -81,7 +81,7 @@
             String sym = bundles[i].getSymbolicName();
             if ((sym != null) && sym.equals(symbolicName))
             {
-                Version v = ((BundleImpl) bundles[i]).getCurrentRevision().getVersion();
+                Version v = bundles[i].adapt(BundleRevision.class).getVersion();
                 if ((vr == null) || vr.isInRange(v))
                 {
                     list.add(bundles[i]);
@@ -96,8 +96,8 @@
         Arrays.sort(bundles,new Comparator() {
             public int compare(Object o1, Object o2)
             {
-                Version v1 = ((BundleImpl) o1).getCurrentRevision().getVersion();
-                Version v2 = ((BundleImpl) o2).getCurrentRevision().getVersion();
+                Version v1 = ((Bundle) o1).adapt(BundleRevision.class).getVersion();
+                Version v2 = ((Bundle) o2).adapt(BundleRevision.class).getVersion();
                 // Compare in reverse order to get descending sort.
                 return v2.compareTo(v1);
             }
@@ -108,7 +108,7 @@
     public int getBundleType(Bundle bundle)
     {
         Map headerMap = ((BundleRevisionImpl)
-            ((BundleImpl) bundle).getCurrentRevision()).getHeaders();
+            bundle.adapt(BundleRevision.class)).getHeaders();
         if (headerMap.containsKey(Constants.FRAGMENT_HOST))
         {
             return PackageAdmin.BUNDLE_TYPE_FRAGMENT;
diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
index 02b5fd4..be6fb4b 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
@@ -485,11 +485,11 @@
             // Get the package.
             String pkgName =
                 Util.getClassPackage(className);
-            BundleRevision requesterRevision = ((BundleImpl) requester).getCurrentRevision();
+            BundleRevision requesterRevision = requester.adapt(BundleRevision.class);
             // Get package wiring from service requester.
             BundleWire requesterWire = Util.getWire(requesterRevision, pkgName);
             // Get package wiring from service provider.
-            BundleRevision providerRevision = ((BundleImpl) m_bundle).getCurrentRevision();
+            BundleRevision providerRevision = m_bundle.adapt(BundleRevision.class);
             BundleWire providerWire = Util.getWire(providerRevision, pkgName);
 
             // There are four situations that may occur here:
diff --git a/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java b/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
index ba2426e..2856581 100644
--- a/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
+++ b/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
@@ -468,7 +468,7 @@
             {
                 // There is nothing we can do.
             }
-            if (bundle.getCurrentRevision() == revision)
+            if (bundle.adapt(BundleRevision.class) == revision)
             {
                 if (bundle.getState() != Bundle.INSTALLED)
                 {
