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 5e1f65b..6d10c76 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
@@ -21,6 +21,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -380,12 +381,12 @@
      * method throws a {@link ComponentException}.
      *
      * @param name The name to register the component under
-     * @param component The component to register
+     * @param componentHolder The component to register
      *
      * @throws ComponentException if the name has not been reserved through
      *      {@link #checkComponentName(String)} yet.
      */
-    final void registerComponentHolder( final ComponentRegistryKey key, ComponentHolder component )
+    final void registerComponentHolder( final ComponentRegistryKey key, ComponentHolder componentHolder )
     {
         synchronized ( m_componentHoldersByName )
         {
@@ -393,17 +394,17 @@
             if ( m_componentHoldersByName.get( key ) != null )
             {
                 // this is not expected if all works ok
-                throw new ComponentException( "The component name '" + component.getComponentMetadata().getName()
+                throw new ComponentException( "The component name '" + componentHolder.getComponentMetadata().getName()
                     + "' has already been registered." );
             }
 
-            m_componentHoldersByName.put( key, component );
+            m_componentHoldersByName.put( key, componentHolder );
         }
 
         synchronized (m_componentHoldersByPid)
         {
             // See if the component declares a specific configuration pid (112.4.4 configuration-pid)
-            String configurationPid = component.getComponentMetadata().getConfigurationPid();
+            String configurationPid = componentHolder.getComponentMetadata().getConfigurationPid();
 
             // Since several components may refer to the same configuration pid, we have to
             // store the component holder in a Set, in order to be able to lookup every
@@ -414,9 +415,15 @@
                 set = new HashSet<ComponentHolder>();
                 m_componentHoldersByPid.put(configurationPid, set);
             }
-            set.add(component);
+            set.add(componentHolder);
         }
-    }
+        
+        if (configurationSupport != null)
+        {
+            configurationSupport.configureComponentHolder(componentHolder);
+        }
+
+  }
 
     /**
      * Returns the component registered under the given name or <code>null</code>
@@ -440,13 +447,12 @@
     }
 
     /**
-     * Returns the list of ComponentHolder instances whose configuration pids are matching
+     * Returns the set of ComponentHolder instances whose configuration pids are matching
      * the given pid.
      * @param pid the pid candidate
-     * @return a iterator of ComponentHolder, or an empty iterator if no ComponentHolders
-     * are found
+     * @return the set of ComponentHolders matching the singleton pid supplied
      */
-    public final Iterator<ComponentHolder> getComponentHoldersByPid(String pid)
+    public final Collection<ComponentHolder> getComponentHoldersByPid(String pid)
     {
         Set<ComponentHolder> componentHoldersUsingPid = new HashSet<ComponentHolder>();
         synchronized (m_componentHoldersByPid)
@@ -458,7 +464,7 @@
                 componentHoldersUsingPid.addAll(set);
             }
         }
-        return componentHoldersUsingPid.iterator();
+        return componentHoldersUsingPid;
     }
 
     /**
@@ -548,11 +554,6 @@
             holder = new ImmediateComponentHolder(activator, metadata);
         }
 
-        if (configurationSupport != null)
-        {
-            configurationSupport.configureComponentHolder(holder);
-        }
-
         return holder;
     }
 
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 4e21c6f..ea3d43c 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
@@ -19,6 +19,7 @@
 package org.apache.felix.scr.impl.config;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -182,33 +183,32 @@
 
         // iterate over all components which must be configured with this pid
         // (since DS 1.2, components may specify a specific configuration PID (112.4.4 configuration-pid)
-        Iterator it;
+        Collection<ComponentHolder> holders;
 
         if (factoryPid == null)
         {
-            it = this.m_registry.getComponentHoldersByPid(pid);
+            holders = this.m_registry.getComponentHoldersByPid(pid);
         }
         else
         {
-            it = this.m_registry.getComponentHoldersByPid(factoryPid);
+            holders = this.m_registry.getComponentHoldersByPid(factoryPid);
         }
 
         Activator.log(LogService.LOG_DEBUG, null, "configurationEvent: Handling "
                 + ((event.getType() == ConfigurationEvent.CM_DELETED) ? "DELETE" : "UPDATE")
                 + " of Configuration PID=" + pid, null);
 
-        while (it.hasNext())
+        for  ( ComponentHolder componentHolder: holders )
         {
-            final ComponentHolder cm = (ComponentHolder) it.next();
-            if (!cm.getComponentMetadata().isConfigurationIgnored())
+            if (!componentHolder.getComponentMetadata().isConfigurationIgnored())
             {
                 switch (event.getType()) {
                 case ConfigurationEvent.CM_DELETED:
-                    cm.configurationDeleted(pid);
+                    componentHolder.configurationDeleted(pid);
                     break;
 
                 case ConfigurationEvent.CM_UPDATED:
-                    final BundleComponentActivator activator = cm.getActivator();
+                    final BundleComponentActivator activator = componentHolder.getActivator();
                     if (activator == null)
                     {
                         break;
@@ -238,13 +238,13 @@
                                             .getBundle().getLocation() );
                                         if ( dict != null )
                                         {
-                                            cm.configurationUpdated( pid, dict );
+                                            componentHolder.configurationUpdated( pid, dict );
                                         }
                                     }
                                     else
                                     {
                                         Activator.log( LogService.LOG_WARNING, null, "Cannot reconfigure component "
-                                            + cm.getComponentMetadata().getName(), null );
+                                            + componentHolder.getComponentMetadata().getName(), null );
                                         Activator.log( LogService.LOG_WARNING, null,
                                             "Component Bundle's Configuration Admin is not compatible with " +
                                             "ours. This happens if multiple Configuration Admin API versions " +
