diff --git a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
index 62bd70e..9cba896 100644
--- a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
@@ -1444,7 +1444,7 @@
     }
 
     private Object doImplicitBootDelegation(Class[] classes, String name, boolean isClass)
-    throws ClassNotFoundException, ResourceNotFoundException
+        throws ClassNotFoundException, ResourceNotFoundException
     {
         // Start from 1 to skip security manager class.
         for (int i = 1; i < classes.length; i++)
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java b/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
index cfdde9c..263ba04 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
@@ -26,8 +26,8 @@
 
 public class ContentDirectoryContent implements Content
 {
-    private Content m_content = null;
-    private String m_rootPath = null;
+    private final Content m_content;
+    private final String m_rootPath;
 
     public ContentDirectoryContent(Content content, String path)
     {
@@ -37,16 +37,15 @@
             ? path + "/" : path;
     }
 
-    public synchronized void close()
+    public void close()
     {
         // We do not actually close the associated content
         // from which we are filtering our directory because
         // we assume that this will be close manually by
         // the owner of that content.
-        m_content = null;
     }
 
-    public synchronized boolean hasEntry(String name) throws IllegalStateException
+    public boolean hasEntry(String name) throws IllegalStateException
     {
         if ((name.length() > 0) && (name.charAt(0) == '/'))
         {
@@ -56,12 +55,12 @@
         return m_content.hasEntry(m_rootPath + name);
     }
 
-    public synchronized Enumeration getEntries()
+    public Enumeration getEntries()
     {
         return new EntriesEnumeration(m_content.getEntries(), m_rootPath);
     }
 
-    public synchronized byte[] getEntryAsBytes(String name) throws IllegalStateException
+    public byte[] getEntryAsBytes(String name) throws IllegalStateException
     {
         if ((name.length() > 0) && (name.charAt(0) == '/'))
         {
@@ -71,7 +70,7 @@
         return m_content.getEntryAsBytes(m_rootPath + name);
     }
 
-    public synchronized InputStream getEntryAsStream(String name)
+    public InputStream getEntryAsStream(String name)
         throws IllegalStateException, IOException
     {
         if ((name.length() > 0) && (name.charAt(0) == '/'))
@@ -109,8 +108,8 @@
 
     private static class EntriesEnumeration implements Enumeration
     {
-        private Enumeration m_enumeration = null;
-        private String m_rootPath = null;
+        private final Enumeration m_enumeration;
+        private final String m_rootPath;
         private String m_nextEntry = null;
 
         public EntriesEnumeration(Enumeration enumeration, String rootPath)
@@ -120,12 +119,12 @@
             m_nextEntry = findNextEntry();
         }
 
-        public boolean hasMoreElements()
+        public synchronized boolean hasMoreElements()
         {
             return (m_nextEntry != null);
         }
 
-        public Object nextElement()
+        public synchronized Object nextElement()
         {
             if (m_nextEntry == null)
             {
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
index 68cd6c9..9db1ca6 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
@@ -54,7 +54,7 @@
         // Nothing to clean up.
     }
 
-    public synchronized boolean hasEntry(String name) throws IllegalStateException
+    public boolean hasEntry(String name) throws IllegalStateException
     {
         if ((name.length() > 0) && (name.charAt(0) == '/'))
         {
@@ -64,7 +64,7 @@
         return new File(m_dir, name).exists();
     }
 
-    public synchronized Enumeration getEntries()
+    public Enumeration getEntries()
     {
         // Wrap entries enumeration to filter non-matching entries.
         Enumeration e = new EntriesEnumeration(m_dir);
@@ -73,7 +73,7 @@
         return (e.hasMoreElements()) ? e : null;
     }
 
-    public synchronized byte[] getEntryAsBytes(String name) throws IllegalStateException
+    public byte[] getEntryAsBytes(String name) throws IllegalStateException
     {
         if ((name.length() > 0) && (name.charAt(0) == '/'))
         {
@@ -120,7 +120,7 @@
         }
     }
 
-    public synchronized InputStream getEntryAsStream(String name)
+    public InputStream getEntryAsStream(String name)
         throws IllegalStateException, IOException
     {
         if ((name.length() > 0) && (name.charAt(0) == '/'))
@@ -131,7 +131,7 @@
         return new FileInputStream(new File(m_dir, name));
     }
 
-    public synchronized Content getEntryAsContent(String entryName)
+    public Content getEntryAsContent(String entryName)
     {
         // If the entry name refers to the content itself, then
         // just return it immediately.
@@ -182,7 +182,7 @@
     }
 
 // TODO: SECURITY - This will need to consider security.
-    public synchronized String getEntryAsNativeLibrary(String entryName)
+    public String getEntryAsNativeLibrary(String entryName)
     {
         // Return result.
         String result = null;
@@ -299,8 +299,8 @@
 
     private static class EntriesEnumeration implements Enumeration
     {
-        private File m_dir = null;
-        private File[] m_children = null;
+        private final File m_dir;
+        private final File[] m_children;
         private int m_counter = 0;
 
         public EntriesEnumeration(File dir)
@@ -309,12 +309,12 @@
             m_children = listFilesRecursive(m_dir);
         }
 
-        public boolean hasMoreElements()
+        public synchronized boolean hasMoreElements()
         {
             return (m_children != null) && (m_counter < m_children.length);
         }
 
-        public Object nextElement()
+        public synchronized Object nextElement()
         {
             if ((m_children == null) || (m_counter >= m_children.length))
             {
@@ -338,7 +338,7 @@
             return sb.toString();
         }
 
-        public File[] listFilesRecursive(File dir)
+        private File[] listFilesRecursive(File dir)
         {
             File[] children = dir.listFiles();
             File[] combined = children;
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java b/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
index 2adef24..7f7ede5 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
@@ -482,7 +482,7 @@
 
     private static class EntriesEnumeration implements Enumeration
     {
-        private Enumeration m_enumeration = null;
+        private final Enumeration m_enumeration;
 
         public EntriesEnumeration(Enumeration enumeration)
         {
