diff --git a/scr/pom.xml b/scr/pom.xml
index c3bdb31..6ea7c93 100644
--- a/scr/pom.xml
+++ b/scr/pom.xml
@@ -412,6 +412,20 @@
         </plugins>
     </build>
 
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>findbugs-maven-plugin</artifactId>
+				<version>2.5.2</version>
+				<configuration>
+					<effort>Max</effort>
+					<threshold>Low</threshold>
+				</configuration>
+			</plugin>
+		</plugins>
+	</reporting>
+
     <profiles>
         <!--
             copy the package such that IDEs may easily use it without
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/Activator.java b/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
index c477b31..4650df1 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
@@ -55,10 +55,10 @@
     private static BundleContext m_context;
 
     // the log service to log messages to
-    private static ServiceTracker m_logService;
+    private static volatile ServiceTracker m_logService;
 
     // the package admin service (see BindMethod.getParameterClass)
-    private static ServiceTracker m_packageAdmin;
+    private static volatile ServiceTracker m_packageAdmin;
 
     // map of BundleComponentActivator instances per Bundle indexed by Bundle id
     private Map<Long, BundleComponentActivator> m_componentBundles;
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java b/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
index 83feac8..1b086d1 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
@@ -325,7 +325,7 @@
         m_active = false;
 
         log( LogService.LOG_DEBUG, "BundleComponentActivator : Bundle [{0}] will destroy {1} instances", new Object[]
-            { new Long( m_context.getBundle().getBundleId() ), new Integer( m_managers.size() ) }, null, null, null );
+            { m_context.getBundle().getBundleId(), m_managers.size() }, null, null, null );
 
         while ( m_managers.size() != 0 )
         {
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java b/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
index c3e4241..8737d6b 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
@@ -119,7 +119,7 @@
      * {@link #registerComponentId(AbstractComponentManager)} method. This
      * counter is only incremented.
      */
-    private volatile long m_componentCounter;
+    private long m_componentCounter = -1;
 
     /**
      * The OSGi service registration for the ScrService provided by this
@@ -139,7 +139,6 @@
         m_componentHoldersByName = new HashMap<ComponentRegistryKey, ComponentHolder>();
         m_componentHoldersByPid = new HashMap<String, Set<ComponentHolder>>();
         m_componentsById = new HashMap<Long, AbstractComponentManager<?>>();
-        m_componentCounter = -1;
 
         // keep me informed on ConfigurationAdmin state changes
         try
@@ -193,7 +192,7 @@
         ArrayList<Component> list = new ArrayList<Component>();
         for ( ComponentHolder holder: holders )
         {
-            if ( holders != null )
+            if ( holder != null )
             {
                 Component[] components = holder.getComponents();
                 for ( Component component: components )
@@ -247,7 +246,7 @@
     {
         synchronized ( m_componentsById )
         {
-            return m_componentsById.get( new Long( componentId ) );
+            return m_componentsById.get( componentId );
         }
     }
 
@@ -286,10 +285,9 @@
         long componentId;
         synchronized ( m_componentsById )
         {
-            m_componentCounter++;
-            componentId = m_componentCounter;
+            componentId = ++m_componentCounter;
 
-            m_componentsById.put( new Long( componentId ), componentManager );
+            m_componentsById.put( componentId, componentManager );
         }
 
         return componentId;
@@ -431,19 +429,10 @@
      */
     public final ComponentHolder getComponentHolder( final Bundle bundle, final String name )
     {
-        ComponentHolder entry;
         synchronized ( m_componentHoldersByName )
         {
-            entry = m_componentHoldersByName.get( new ComponentRegistryKey( bundle, name ) );
+            return m_componentHoldersByName.get( new ComponentRegistryKey( bundle, name ) );
         }
-
-        // only return the entry if non-null and not a reservation
-        if ( entry instanceof ComponentHolder )
-        {
-            return ( ComponentHolder ) entry;
-        }
-
-        return null;
     }
 
     /**
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/ScrShellCommand.java b/scr/src/main/java/org/apache/felix/scr/impl/ScrShellCommand.java
index b7045ee..32ac2d8 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/ScrShellCommand.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/ScrShellCommand.java
@@ -63,28 +63,19 @@
     public void execute(String commandLine, PrintStream out, PrintStream err)
     {
         // Parse the commandLine to get the OBR command.
-        StringTokenizer st = new StringTokenizer(commandLine);
+        String[] st = commandLine.split("//s");
         // Ignore the invoking command.
-        st.nextToken();
         // Try to get the OBR command, default is HELP command.
-        String command = HELP_CMD;
-        try
-        {
-            command = st.nextToken();
-        }
-        catch (Exception ex)
-        {
-            // Ignore.
-        }
-
+        String command = st.length > 1? st[1]: HELP_CMD;
+        String arg = (st.length > 2) ? st[2] : null;
+        
         // Perform the specified command.
-        if ((command == null) || (command.equals(HELP_CMD)))
+        if (command.equals(HELP_CMD))
         {
-            help(out, st);
+            help(out, arg);
         }
         else
         {
-            String arg = (st.hasMoreTokens()) ? st.nextToken() : null;
             PrintWriter pw = new PrintWriter(out);
             try
             {
@@ -120,13 +111,8 @@
         }
     }
 
-    private void help(PrintStream out, StringTokenizer st)
+    private void help(PrintStream out, String command)
     {
-        String command = HELP_CMD;
-        if (st.hasMoreTokens())
-        {
-            command = st.nextToken();
-        }
         if (command.equals(LIST_CMD))
         {
             out.println("");
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
index dcd6726..fd64345 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
@@ -108,7 +108,6 @@
         if (!holder.getComponentMetadata().isConfigurationIgnored())
         {
             final BundleContext bundleContext = holder.getActivator().getBundleContext();
-            final String bundleLocation = bundleContext.getBundle().getLocation();
             final String confPid = holder.getComponentMetadata().getConfigurationPid();
 
             final ServiceReference caRef = bundleContext.getServiceReference(ComponentRegistry.CONFIGURATION_ADMIN);
@@ -159,7 +158,6 @@
                                     + "ours. This happens if multiple Configuration Admin API versions "
                                     + "are deployed and different bundles wire to different versions", null );
 
-                            Class<?> caoc = cao.getClass();
                         }
                     }
                     finally
@@ -462,50 +460,7 @@
             }
         }
         return confInfo;
-    }
-    
-    private ConfigurationAdmin getConfigurationAdmin(BundleContext bundleContext)
-    {
-        final ServiceReference caRef = bundleContext
-                .getServiceReference(ComponentRegistry.CONFIGURATION_ADMIN);
-            if (caRef != null)
-            {
-                try
-                {
-                    final Object cao = bundleContext.getService(caRef);
-                    if (cao != null)
-                    {
-                        try
-                        {
-                            if ( cao instanceof ConfigurationAdmin )
-                            {
-                                return ( ConfigurationAdmin ) cao;
-                            }
-                            else
-                            {
-                                Activator.log( LogService.LOG_WARNING, null,
-                                    "Component Bundle's Configuration Admin is not compatible with " +
-                                    "ours. This happens if multiple Configuration Admin API versions " +
-                                    "are deployed and different bundles wire to different versions",
-                                    null );
-                            }
-                        }
-                        finally
-                        {
-                            bundleContext.ungetService( caRef );
-                        }
-                    }
-                }
-                catch (IllegalStateException ise)
-                {
-                    // If the bundle has been stopped concurrently
-                    Activator.log(LogService.LOG_WARNING, null, "Bundle in unexpected state",
-                        ise);
-                }
-            }
-            return null;
-       
-    }
+    }    
 
     private Configuration getConfiguration(final ConfigurationAdmin ca, final String pid)
     {
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ScrConfiguration.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ScrConfiguration.java
index 3318c46..46a1f51 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ScrConfiguration.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ScrConfiguration.java
@@ -115,7 +115,7 @@
         props.put(Constants.SERVICE_PID, PID);
         props.put(Constants.SERVICE_DESCRIPTION, "SCR Configurator");
         props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
-        bundleContext.registerService("org.osgi.service.cm.ManagedService", new ScrManagedServiceServiceFactory(this),
+        managedService = bundleContext.registerService("org.osgi.service.cm.ManagedService", new ScrManagedServiceServiceFactory(this),
             props);
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java
index 3ee8ff6..303e7f0 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java
@@ -129,7 +129,7 @@
             }
             else if ( parameterTypes[i] == INTEGER_CLASS || parameterTypes[i] == Integer.TYPE )
             {
-                param[i] = new Integer( ap.getReason() );
+                param[i] = ap.getReason();
             }
         }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
index 747d50e..6d9ee8c 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
@@ -22,6 +22,8 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.Arrays;
 import java.util.Map;
 
@@ -109,7 +111,7 @@
     }
 
 
-    synchronized void setMethod( Method method, SimpleLogger logger )
+    void setMethod( Method method, SimpleLogger logger )
     {
         this.m_method = method;
 
@@ -162,8 +164,9 @@
         final Class targetClass = getComponentClass();
         final ClassLoader targetClasslLoader = targetClass.getClassLoader();
         final String targetPackage = getPackageName( targetClass );
+        Class theClass = targetClass;
 
-        for ( Class theClass = targetClass; theClass != null; )
+        while (true) 
         {
 
             if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
@@ -402,7 +405,7 @@
      * @param allowReturnValue whether the method can return a value (to update service registration properties)
      * @return whether the method is acceptable
      */
-    static boolean accept( Method method, boolean acceptPrivate, boolean acceptPackage, boolean allowReturnValue )
+    static boolean accept( final Method method, boolean acceptPrivate, boolean acceptPackage, boolean allowReturnValue )
     {
         if (!(Void.TYPE == method.getReturnType() || (MAP_CLASS == method.getReturnType() && allowReturnValue)))
         {
@@ -421,7 +424,7 @@
         // accept public and protected methods
         if ( Modifier.isPublic( mod ) || Modifier.isProtected( mod ) )
         {
-            method.setAccessible( true );
+            setAccessible( method );
             return true;
         }
 
@@ -430,7 +433,7 @@
         {
             if ( acceptPrivate )
             {
-                method.setAccessible( acceptPrivate );
+                setAccessible( method );
                 return true;
             }
 
@@ -440,7 +443,7 @@
         // accept default (package)
         if ( acceptPackage )
         {
-            method.setAccessible( true );
+            setAccessible( method );
             return true;
         }
 
@@ -449,6 +452,19 @@
     }
 
 
+    private static void setAccessible(final Method method)
+    {
+        AccessController.doPrivileged( new PrivilegedAction<Object>()
+        {
+            public Object run()
+            {
+                method.setAccessible( true );
+                return null;
+            }
+        } );
+    }
+
+
     /**
      * Returns the name of the package to which the class belongs or an
      * empty string if the class is in the default package.
@@ -539,20 +555,19 @@
         private static final State INSTANCE = new NotResolved();
 
 
-        private void resolve( final BaseMethod baseMethod, SimpleLogger logger )
+        private synchronized void resolve( final BaseMethod baseMethod, SimpleLogger logger )
         {
             logger.log( LogService.LOG_DEBUG, "getting {0}: {1}", new Object[]
                     {baseMethod.getMethodNamePrefix(), baseMethod.getMethodName()}, null );
 
             // resolve the method
-            Method method;
+            Method method = null;
             try
             {
                 method = baseMethod.findMethod( logger );
             }
             catch ( InvocationTargetException ex )
             {
-                method = null;
                 logger.log( LogService.LOG_WARNING, "{0} cannot be found", new Object[]
                         {baseMethod.getMethodName()}, ex.getTargetException() );
             }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/ReadOnlyDictionary.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/ReadOnlyDictionary.java
index 47aad82..03e97fb 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/ReadOnlyDictionary.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/ReadOnlyDictionary.java
@@ -38,26 +38,26 @@
 public class ReadOnlyDictionary<S, T> extends Dictionary<S, T> implements Map<S, T>
 {
 
-    private final Hashtable<S, T> m_delegatee;
+    private final Hashtable<S, T> m_delegate;
 
 
     /**
-     * Creates a wrapper for the given delegatee dictionary providing read
+     * Creates a wrapper for the given delegate dictionary providing read
      * only access to the data.
      */
-    public ReadOnlyDictionary( final Dictionary<S, T> delegatee )
+    public ReadOnlyDictionary( final Dictionary<S, T> delegate )
     {
-        if ( delegatee instanceof Hashtable )
+        if ( delegate instanceof Hashtable )
         {
-            this.m_delegatee = ( Hashtable<S, T> ) delegatee;
+            this.m_delegate = ( Hashtable<S, T> ) delegate;
         }
         else
         {
-            this.m_delegatee = new Hashtable<S, T>();
-            for ( Enumeration<S> ke = delegatee.keys(); ke.hasMoreElements(); )
+            this.m_delegate = new Hashtable<S, T>();
+            for ( Enumeration<S> ke = delegate.keys(); ke.hasMoreElements(); )
             {
                 S key = ke.nextElement();
-                this.m_delegatee.put( key, delegatee.get( key ) );
+                this.m_delegate.put( key, delegate.get( key ) );
             }
         }
     }
@@ -79,7 +79,7 @@
                 properties.put( key, serviceReference.getProperty( key ) );
             }
         }
-        m_delegatee = properties;
+        m_delegate = properties;
     }
 
 
@@ -87,24 +87,24 @@
 
     public Enumeration<T> elements()
     {
-        return m_delegatee.elements();
+        return m_delegate.elements();
     }
 
     public T get( final Object key )
     {
-        return m_delegatee.get( key );
+        return m_delegate.get( key );
     }
 
 
     public boolean isEmpty()
     {
-        return m_delegatee.isEmpty();
+        return m_delegate.isEmpty();
     }
 
 
     public Enumeration<S> keys()
     {
-        return m_delegatee.keys();
+        return m_delegate.keys();
     }
 
 
@@ -130,13 +130,13 @@
 
     public int size()
     {
-        return m_delegatee.size();
+        return m_delegate.size();
     }
 
 
     public String toString()
     {
-        return m_delegatee.toString();
+        return m_delegate.toString();
     }
 
 
@@ -150,25 +150,25 @@
 
     public boolean containsKey( Object key )
     {
-        return m_delegatee.containsKey( key );
+        return m_delegate.containsKey( key );
     }
 
 
     public boolean containsValue( Object value )
     {
-        return m_delegatee.containsValue( value );
+        return m_delegate.containsValue( value );
     }
 
 
     public Set entrySet()
     {
-        return Collections.unmodifiableSet( m_delegatee.entrySet() );
+        return Collections.unmodifiableSet( m_delegate.entrySet() );
     }
 
 
     public Set keySet()
     {
-        return Collections.unmodifiableSet( m_delegatee.keySet() );
+        return Collections.unmodifiableSet( m_delegate.keySet() );
     }
 
 
@@ -180,6 +180,6 @@
 
     public Collection values()
     {
-        return Collections.unmodifiableCollection( m_delegatee.values() );
+        return Collections.unmodifiableCollection( m_delegate.values() );
     }
 }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index f428c90..753b27c 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -108,16 +108,9 @@
     private final Object enabledLatchLock = new Object();
 
     protected volatile boolean m_internalEnabled;
-    /**
-     * synchronizing while creating the service registration is safe as long as the bundle is not stopped
-     * during some service registrations.  So, avoid synchronizing during unregister service if the component is being
-     * disposed.
-     */
-    private volatile boolean disposed;
-
 
     //service event tracking
-    private volatile int floor;
+    private int floor;
 
     private volatile int ceiling;
 
@@ -153,9 +146,9 @@
                 LogService.LOG_DEBUG,
                 "Component {0} created: DS={1}, implementation={2}, immediate={3}, default-enabled={4}, factory={5}, configuration-policy={6}, activate={7}, deactivate={8}, modified={9} configuration-pid={10}",
                 new Object[]
-                    { metadata.getName(), new Integer( metadata.getNamespaceCode() ),
-                        metadata.getImplementationClassName(), Boolean.valueOf( metadata.isImmediate() ),
-                        Boolean.valueOf( metadata.isEnabled() ), metadata.getFactoryIdentifier(),
+                    { metadata.getName(), metadata.getNamespaceCode(),
+                        metadata.getImplementationClassName(), metadata.isImmediate(),
+                        metadata.isEnabled(), metadata.getFactoryIdentifier(),
                         metadata.getConfigurationPolicy(), metadata.getActivate(), metadata.getDeactivate(),
                         metadata.getModified(), metadata.getConfigurationPid() }, null );
 
@@ -527,7 +520,6 @@
      */
     public void dispose( int reason )
     {
-        disposed = true;
         disposeInternal( reason );
     }
     
@@ -1054,19 +1046,11 @@
         return depMgrList;
     }
 
-    private void enableDependencyManagers() throws InvalidSyntaxException
-    {
-        if ( !m_componentMetadata.isConfigurationRequired() || hasConfiguration() )
-        {
-            updateTargets( getProperties() );
-        }
-    }
-
-    protected void updateTargets(Dictionary properties)
+    protected void updateTargets(Dictionary<String, Object> properties)
     {
         if ( m_internalEnabled )
         {
-            for ( DependencyManager dm: getDependencyManagers() )
+            for ( DependencyManager<S, ?> dm: getDependencyManagers() )
             {
                 dm.setTargetFilter( properties );
             }
@@ -1078,7 +1062,7 @@
         // indicates whether all dependencies are satisfied
         boolean satisfied = true;
 
-        for ( DependencyManager dm: getDependencyManagers() )
+        for ( DependencyManager<S, ?> dm: getDependencyManagers() )
         {
 
             if ( !dm.hasGetPermission() )
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
index 6177799..0663539 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurationComponentFactoryImpl.java
@@ -49,7 +49,7 @@
  * with earlier releases of the Apache Felix Declarative Services implementation.
  * But keep in mind, that this is non-standard behaviour.
  */
-public class ConfigurationComponentFactoryImpl<S> extends ComponentFactoryImpl<S> implements ComponentHolder
+public class ConfigurationComponentFactoryImpl<S> extends ComponentFactoryImpl<S>
 {
 
     /**
@@ -57,7 +57,7 @@
      * {@link org.apache.felix.scr.impl.manager.ImmediateComponentManager} for configuration updating this map is
      * lazily created.
      */
-    private Map<String, ImmediateComponentManager<S>> m_configuredServices;
+    private final Map<String, ImmediateComponentManager<S>> m_configuredServices = new HashMap<String, ImmediateComponentManager<S>>();
 
     public ConfigurationComponentFactoryImpl( BundleComponentActivator activator, ComponentMetadata metadata )
     {
@@ -92,13 +92,14 @@
      * configuration instances are to disabled as a consequence of deactivating
      * the component factory.
      */
+    @Override
     protected void deleteComponent( int reason )
     {
-        List cms = new ArrayList( );
+        List<AbstractComponentManager<S>> cms = new ArrayList<AbstractComponentManager<S>>( );
         getComponentManagers( m_configuredServices, cms );
-        for ( Iterator i = cms.iterator(); i.hasNext(); )
+        for ( AbstractComponentManager<S> cm: cms )
         {
-            ((AbstractComponentManager)i.next()).disable();
+            cm.disable();
         }
     }
 
@@ -113,21 +114,17 @@
         }
         else
         {
-            Map configuredServices = m_configuredServices;
-            if ( configuredServices != null )
+            ImmediateComponentManager<S> cm;
+            synchronized ( m_configuredServices )
             {
-                ImmediateComponentManager cm;
-                synchronized ( configuredServices )
-                {
-                    cm = ( ImmediateComponentManager ) configuredServices.remove( pid );
-                }
+                cm = m_configuredServices.remove( pid );
+            }
 
-                if ( cm != null )
-                {
-                    log( LogService.LOG_DEBUG, "Disposing component after configuration deletion", null );
+            if ( cm != null )
+            {
+                log( LogService.LOG_DEBUG, "Disposing component after configuration deletion", null );
 
-                    cm.dispose();
-                }
+                cm.dispose();
             }
         }
     }
@@ -142,16 +139,9 @@
         else   //non-spec backwards compatible
         {
             ImmediateComponentManager<S> cm;
-            Map<String, ImmediateComponentManager<S>> configuredServices = m_configuredServices;
-            if ( configuredServices != null )
+            synchronized ( m_configuredServices )
             {
-                cm = configuredServices.get( pid );
-            }
-            else
-            {
-                m_configuredServices = new HashMap<String, ImmediateComponentManager<S>>();
-                configuredServices = m_configuredServices;
-                cm = null;
+                cm = m_configuredServices.get( pid );
             }
 
             if ( cm == null )
@@ -169,8 +159,11 @@
                     cm.enable( false );
                 }
 
-                // keep a reference for future updates
-                configuredServices.put( pid, cm );
+                synchronized ( m_configuredServices )
+                {
+                    // keep a reference for future updates
+                    m_configuredServices.put( pid, cm );
+                }
 
             }
             else
@@ -207,7 +200,7 @@
             acm.dispose( reason );
         }
 
-        m_configuredServices = null;
+        m_configuredServices.clear();
 
         // finally dispose the component factory itself
         dispose( reason );
@@ -220,12 +213,11 @@
         {
             return m_changeCount;
         }
-        if (m_configuredServices == null)
+        synchronized ( m_configuredServices )
         {
-            return -1;
+            ImmediateComponentManager icm = m_configuredServices.get( pid );
+            return icm == null? -1: icm.getChangeCount();
         }
-        ImmediateComponentManager icm =  m_configuredServices.get( pid );
-        return icm == null? -1: icm.getChangeCount();
     }
 
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java
index d32ce39..fd9b5dc 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java
@@ -203,7 +203,7 @@
 		this.trackClass = clazz;
 		this.customizer = customizer;
 		// we call clazz.toString to verify clazz is non-null!
-		this.listenerFilter = "(" + Constants.OBJECTCLASS + "=" + clazz.toString() + ")";
+		this.listenerFilter = "(" + Constants.OBJECTCLASS + "=" + clazz + ")";
 		try {
 			this.filter = context.createFilter(listenerFilter);
 		} catch (InvalidSyntaxException e) {
@@ -243,11 +243,11 @@
 		this.filter = filter;
 		this.customizer = customizer;
 		this.active = initialActive;
-		if ((context == null) || (filter == null)) {
+		if ((context == null)) {
 			/*
 			 * we throw a NPE here to be consistent with the other constructors
 			 */
-			throw new NullPointerException();
+			throw new NullPointerException( "BundleContext");
 		}
 	}
 
@@ -1440,6 +1440,9 @@
 					 * safe to let it propagate
 					 */
 					break;
+				default :
+	                System.out.println("Unrecognized event type: ServiceTracker.Tracked.serviceChanged[" + event.getType() + "]: " + reference);
+				    
 			}
 		}
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/metadata/PropertyMetadata.java b/scr/src/main/java/org/apache/felix/scr/impl/metadata/PropertyMetadata.java
index 6d954ab..fc7a838 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/metadata/PropertyMetadata.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/metadata/PropertyMetadata.java
@@ -225,7 +225,7 @@
             // For Character types, the conversion is handled by Integer.valueOf method.
             // (since valueOf is defined in terms of parseInt we directly call
             // parseInt to prevent unneeded Object creation)
-            return new Character( ( char ) Integer.parseInt( value ) );
+            return Character.valueOf( ( char ) Integer.parseInt( value ) );
         }
         else if ( m_type.equals( "Boolean" ) )
         {
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java b/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
index 0ded76d..e5df6e0 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
@@ -111,12 +111,12 @@
     static
     {
         NAMESPACE_CODE_MAP = new HashMap();
-        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_EMPTY, new Integer( DS_VERSION_1_0 ) );
-        NAMESPACE_CODE_MAP.put( NAMESPACE_URI, new Integer( DS_VERSION_1_0 ) );
-        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_1, new Integer( DS_VERSION_1_1 ) );
-        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_1_FELIX, new Integer( DS_VERSION_1_1_FELIX ) );
-        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_2, new Integer( DS_VERSION_1_2 ) );
-        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_2_FELIX, new Integer( DS_VERSION_1_2_FELIX ) );
+        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_EMPTY, DS_VERSION_1_0 );
+        NAMESPACE_CODE_MAP.put( NAMESPACE_URI, DS_VERSION_1_0 );
+        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_1, DS_VERSION_1_1 );
+        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_1_FELIX, DS_VERSION_1_1_FELIX );
+        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_2, DS_VERSION_1_2 );
+        NAMESPACE_CODE_MAP.put( NAMESPACE_URI_1_2_FELIX, DS_VERSION_1_2_FELIX );
     }
 
 
