diff --git a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
index fc3955d..609bcfc 100644
--- a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
+++ b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
@@ -18,8 +18,6 @@
  */
 package org.apache.felix.ipojo.handlers.configuration;
 
-import java.util.*;
-
 import org.apache.felix.ipojo.ConfigurationException;
 import org.apache.felix.ipojo.Factory;
 import org.apache.felix.ipojo.HandlerFactory;
@@ -40,8 +38,11 @@
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.ManagedService;
 
+import java.util.*;
+
 /**
  * Handler managing the Configuration Admin.
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class ConfigurationHandler extends PrimitiveHandler implements ManagedService {
@@ -49,89 +50,81 @@
     /**
      * List of the configurable fields.
      */
-    private List/*<Property>*/ m_configurableProperties = new ArrayList(1);
-
+    private List<Property> m_configurableProperties = new ArrayList<Property>(1);
     /**
      * ProvidedServiceHandler of the component. It is useful to propagate
      * properties to service registrations.
      */
     private ProvidedServiceHandler m_providedServiceHandler;
-
     /**
      * Properties propagated during the last instance "update".
      */
     private Dictionary m_propagatedFromInstance = new Properties();
-
     /**
      * Properties to propagate.
      */
-    private Dictionary m_toPropagate = new Properties();
-
+    private Dictionary<String, Object> m_toPropagate = new Hashtable<String, Object>();
     /**
      * Properties propagated from the configuration admin.
      */
     private Dictionary m_propagatedFromCA;
-
     /**
      * Check if the instance was already reconfigured by the configuration admin.
      */
     private boolean m_configurationAlreadyPushed;
-
     /**
      * should the component propagate configuration ?
      */
     private boolean m_mustPropagate;
-
     /**
      * Service Registration to publish the service registration.
      */
     private ServiceRegistration m_sr;
-
     /**
      * Managed Service PID.
      * This PID must be different from the instance name if the instance was created
      * with the Configuration Admin.
      */
     private String m_managedServicePID;
-
     /**
      * the handler description.
      */
     private ConfigurationHandlerDescription m_description;
-
     /**
      * Updated method.
      * This method is called when a reconfiguration is completed.
      */
     private Callback m_updated;
 
-
     /**
      * Initialize the component type.
-     * @param desc : component type description to populate.
+     *
+     * @param desc     : component type description to populate.
      * @param metadata : component type metadata.
      * @throws ConfigurationException : metadata are incorrect.
      * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentTypeDescription, org.apache.felix.ipojo.metadata.Element)
      */
     public void initializeComponentFactory(ComponentTypeDescription desc, Element metadata) throws ConfigurationException {
         Element[] confs = metadata.getElements("Properties", "");
-        if (confs == null) { return; }
+        if (confs == null) {
+            return;
+        }
         Element[] configurables = confs[0].getElements("Property");
         for (int i = 0; configurables != null && i < configurables.length; i++) {
             String fieldName = configurables[i].getAttribute("field");
             String methodName = configurables[i].getAttribute("method");
             String paramIndex = configurables[i].getAttribute("constructor-parameter");
 
-            if (fieldName == null && methodName == null  && paramIndex == null) {
+            if (fieldName == null && methodName == null && paramIndex == null) {
                 throw new ConfigurationException("Malformed property : The property needs to contain" +
                         " at least a field, a method or a constructor-parameter");
             }
 
             String name = configurables[i].getAttribute("name");
             if (name == null) {
-                if (fieldName == null  && methodName != null) {
+                if (fieldName == null && methodName != null) {
                     name = methodName;
-                } else if (fieldName == null  && paramIndex != null) {
+                } else if (fieldName == null && paramIndex != null) {
                     name = paramIndex;
                 } else {
                     name = fieldName;
@@ -160,7 +153,9 @@
                 }
             } else if (fieldName != null) {
                 FieldMetadata field = manipulation.getField(fieldName);
-                if (field == null) { throw new ConfigurationException("Malformed property : The field " + fieldName + " does not exist in the implementation class"); }
+                if (field == null) {
+                    throw new ConfigurationException("Malformed property : The field " + fieldName + " does not exist in the implementation class");
+                }
                 type = field.getFieldType();
                 configurables[i].addAttribute(new Attribute("type", type)); // Add the type to avoid configure checking
             } else if (paramIndex != null) {
@@ -169,7 +164,7 @@
                 MethodMetadata[] cts = manipulation.getConstructors();
                 // If we don't have a type, try to get the first constructor and get the type of the parameter
                 // we the index 'index'.
-                if (type == null && cts.length > 0  && cts[0].getMethodArguments().length > index) {
+                if (type == null && cts.length > 0 && cts[0].getMethodArguments().length > index) {
                     type = cts[0].getMethodArguments()[index];
                 } else if (type == null) { // Applied only if type was not determined.
                     throw new ConfigurationException("Cannot determine the type of the property " + index +
@@ -185,7 +180,7 @@
 
             boolean mandatory = false;
             String man = configurables[i].getAttribute("mandatory");
-            mandatory =  man != null && man.equalsIgnoreCase("true");
+            mandatory = man != null && man.equalsIgnoreCase("true");
 
             PropertyDescription pd = null;
             if (value == null) {
@@ -207,7 +202,8 @@
      * Configures the handler.
      * Access to field does not require synchronization as this method is executed
      * before any thread access to this object.
-     * @param metadata the metadata of the component
+     *
+     * @param metadata      the metadata of the component
      * @param configuration the instance configuration
      * @throws ConfigurationException one property metadata is not correct
      * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
@@ -220,13 +216,17 @@
         // Check if the component is dynamically configurable
         // Propagation enabled by default.
         m_mustPropagate = true;
-        // We must create a copy as the Config Admin dictionary has some limitation
-        m_toPropagate = new Properties();
+        // We must create a copy as the Config Admin dictionary has some limitations
+        m_toPropagate = new Hashtable<String, Object>();
         if (configuration != null) {
             Enumeration keys = configuration.keys();
             while (keys.hasMoreElements()) {
                 String key = (String) keys.nextElement();
-                m_toPropagate.put(key, configuration.get(key));
+                // To conform with 'Property Propagation 104.4.4 (Config Admin spec)',
+                // we don't propagate properties starting with .
+                if (!key.startsWith(".")) {
+                    m_toPropagate.put(key, configuration.get(key));
+                }
             }
         }
 
@@ -254,7 +254,7 @@
                 m_updated = new Callback(upd, new Class[0], false, getInstanceManager());
             } else if (method.getMethodArguments().length == 1
                     && method.getMethodArguments()[0].equals(Dictionary.class.getName())) {
-                m_updated = new Callback(upd, new Class[] {Dictionary.class}, false, getInstanceManager());
+                m_updated = new Callback(upd, new Class[]{Dictionary.class}, false, getInstanceManager());
             } else {
                 throw new ConfigurationException("The updated method is found in the class "
                         + getInstanceManager().getClassName() + " must have either no argument or a Dictionary");
@@ -272,7 +272,7 @@
 
             String type = configurables[i].getAttribute("type"); // The initialize method has fixed the property name.
 
-            Property prop = null;
+            Property prop;
             if (paramIndex == null) {
                 prop = new Property(name, fieldName, methodName, value, type, getInstanceManager(), this);
             } else {
@@ -306,11 +306,12 @@
     }
 
     /**
-      * Stop method.
-      * This method is synchronized to avoid the configuration admin pushing a configuration during the un-registration.
-      * Do nothing.
-      * @see org.apache.felix.ipojo.Handler#stop()
-      */
+     * Stop method.
+     * This method is synchronized to avoid the configuration admin pushing a configuration during the un-registration.
+     * Do nothing.
+     *
+     * @see org.apache.felix.ipojo.Handler#stop()
+     */
     public synchronized void stop() {
         if (m_sr != null) {
             m_sr.unregister();
@@ -322,6 +323,7 @@
      * Start method.
      * This method is synchronized to avoid the config admin pushing a configuration before ending the method.
      * Propagate properties if the propagation is activated.
+     *
      * @see org.apache.felix.ipojo.Handler#start()
      */
     public synchronized void start() {
@@ -331,8 +333,7 @@
 
         // Propagation
         if (m_mustPropagate) {
-            for (int i = 0; i < m_configurableProperties.size(); i++) {
-                Property prop = (Property) m_configurableProperties.get(i);
+            for (Property prop : m_configurableProperties) {
                 if (prop.getValue() != Property.NO_VALUE && prop.getValue() != null) { // No injected value, or null
                     m_toPropagate.put(prop.getName(), prop.getValue());
                 }
@@ -342,8 +343,7 @@
 
 
         // Give initial values and reset the 'invoked' flag.
-        for (int i = 0; i < m_configurableProperties.size(); i++) {
-            Property prop = (Property) m_configurableProperties.get(i);
+        for (Property prop : m_configurableProperties) {
             prop.reset(); // Clear the invoked flag.
             if (prop.hasField() && prop.getValue() != Property.NO_VALUE && prop.getValue() != null) {
                 getInstanceManager().onSet(null, prop.getField(), prop.getValue());
@@ -351,7 +351,7 @@
         }
 
         if (m_managedServicePID != null && m_sr == null) {
-            Properties props = new Properties();
+            Hashtable<String, Object> props = new Hashtable<String, Object>();
             props.put(Constants.SERVICE_PID, m_managedServicePID);
             props.put(Factory.INSTANCE_NAME_PROPERTY, getInstanceManager().getInstanceName());
             props.put("factory.name", getInstanceManager().getFactory().getFactoryName());
@@ -359,7 +359,7 @@
             // Security Check
             if (SecurityHelper.hasPermissionToRegisterService(ManagedService.class.getName(),
                     getInstanceManager().getContext())) {
-                m_sr = getInstanceManager().getContext().registerService(ManagedService.class.getName(), this, (Dictionary) props);
+                m_sr = getInstanceManager().getContext().registerService(ManagedService.class.getName(), this, props);
             } else {
                 error("Cannot register the ManagedService - The bundle "
                         + getInstanceManager().getContext().getBundle().getBundleId()
@@ -378,22 +378,10 @@
     }
 
     /**
-     * Checks if the list contains the property.
-     *
-     * @param name : name of the property
-     * @return true if the property exist in the list
-     */
-    protected boolean containsProperty(String name) {
-        for (int i = 0; i < m_configurableProperties.size(); i++) {
-            if (((Property) m_configurableProperties.get(i)).getName().equals(name)) { return true; }
-        }
-        return false;
-    }
-
-    /**
      * Reconfigure the component instance.
      * Check if the new configuration modifies the current configuration.
      * Invokes the updated method is needed.
+     *
      * @param configuration : the new configuration
      * @see org.apache.felix.ipojo.Handler#reconfigure(java.util.Dictionary)
      */
@@ -415,6 +403,7 @@
     /**
      * Reconfigured configuration properties and returns non matching properties.
      * When called, it must hold the monitor lock.
+     *
      * @param configuration : new configuration
      * @return the properties that does not match with configuration properties
      */
@@ -426,8 +415,7 @@
             Object value = configuration.get(name);
             boolean found = false;
             // Check if the name is a configurable property
-            for (int i = 0; i < m_configurableProperties.size(); i++) {
-                Property prop = (Property) m_configurableProperties.get(i);
+            for (Property prop : m_configurableProperties) {
                 if (prop.getName().equals(name)) {
                     reconfigureProperty(prop, value);
                     found = true;
@@ -441,8 +429,7 @@
         }
 
         // Every removed configurable property gets reset to its default value
-        for (int i = 0; i < m_configurableProperties.size(); i++) {
-            Property prop = (Property) m_configurableProperties.get(i);
+        for (Property prop : m_configurableProperties) {
             if (configuration.get(prop.getName()) == null) {
                 reconfigureProperty(prop, prop.getDefaultValue());
             }
@@ -456,11 +443,12 @@
      * This methods handles {@link org.apache.felix.ipojo.InstanceManager#onSet(Object, String, Object)}
      * call and the callback invocation.
      * The reconfiguration occurs only if the value changes.
-     * @param prop the property object to reconfigure
+     *
+     * @param prop  the property object to reconfigure
      * @param value the new value.
      */
     public void reconfigureProperty(Property prop, Object value) {
-        if (prop.getValue() == null || ! prop.getValue().equals(value)) {
+        if (prop.getValue() == null || !prop.getValue().equals(value)) {
             prop.setValue(value);
             if (prop.hasField()) {
                 getInstanceManager().onSet(null, prop.getField(), prop.getValue()); // Notify other handler of the field value change.
@@ -475,6 +463,7 @@
 
     /**
      * Removes the old properties from the provided services and propagate new properties.
+     *
      * @param newProps : new properties to propagate
      * @param oldProps : old properties to remove
      */
@@ -489,6 +478,20 @@
                 newProps.remove("name");
                 newProps.remove("managed.service.pid");
                 newProps.remove(Constants.SERVICE_PID);
+
+                // Remove all properties starting with . (config admin specification)
+                Enumeration<String> keys = newProps.keys();
+                List<String> propertiesStartingWithDot = new ArrayList<String>();
+                while (keys.hasMoreElements()) {
+                    String key = keys.nextElement();
+                    if (key.startsWith(".")) {
+                        propertiesStartingWithDot.add(key);
+                    }
+                }
+                for (String k : propertiesStartingWithDot) {
+                    newProps.remove(k);
+                }
+
                 // Propagation of the properties to service registrations :
                 m_providedServiceHandler.addProperties(newProps);
             }
@@ -499,12 +502,12 @@
      * Handler createInstance method.
      * This method is override to allow delayed callback invocation.
      * Invokes the updated method is needed.
+     *
      * @param instance : the created object
      * @see org.apache.felix.ipojo.PrimitiveHandler#onCreation(Object)
      */
     public void onCreation(Object instance) {
-        for (int i = 0; i < m_configurableProperties.size(); i++) {
-            Property prop = (Property) m_configurableProperties.get(i);
+        for (Property prop : m_configurableProperties) {
             if (prop.hasMethod()) {
                 prop.invoke(instance);
             }
@@ -522,9 +525,10 @@
      * This method build the dictionary containing all valued properties,
      * as well as properties propagated to the provided service handler (
      * only if the propagation is enabled).
+     *
      * @param instance the instance on which the callback must be called.
-     * If <code>null</code> the callback is called on all the existing
-     * object.
+     *                 If <code>null</code> the callback is called on all the existing
+     *                 object.
      */
     private void notifyUpdated(Object instance) {
         if (m_updated == null) {
@@ -548,14 +552,14 @@
 
         // Else we must compute the properties.
         Properties props = new Properties();
-        for (int i = 0; i < m_configurableProperties.size(); i++) {
-            String n = ((Property) m_configurableProperties.get(i)).getName();
-            Object v = ((Property) m_configurableProperties.get(i)).getValue();
+        for (Property property : m_configurableProperties) {
+            String n = property.getName();
+            Object v = property.getValue();
             if (v != Property.NO_VALUE) {
                 props.put(n, v);
             }
         }
-        // add propagated properties to the list if propagation enable
+        // add propagate properties to the list if propagation is enabled
         if (m_mustPropagate) {
             // Start by properties from the configuration admin,
             if (m_propagatedFromCA != null) {
@@ -563,7 +567,7 @@
                 Enumeration e = m_propagatedFromCA.keys();
                 while (e.hasMoreElements()) {
                     String k = (String) e.nextElement();
-                    if (! k.equals(Factory.INSTANCE_NAME_PROPERTY)) {
+                    if (!k.equals(Factory.INSTANCE_NAME_PROPERTY)) {
                         props.put(k, m_propagatedFromCA.get(k));
                     }
                 }
@@ -573,7 +577,7 @@
                 Enumeration e = m_propagatedFromInstance.keys();
                 while (e.hasMoreElements()) {
                     String k = (String) e.nextElement();
-                    if (! k.equals(Factory.INSTANCE_NAME_PROPERTY)) { // Skip instance.name
+                    if (!k.equals(Factory.INSTANCE_NAME_PROPERTY)) { // Skip instance.name
                         props.put(k, m_propagatedFromInstance.get(k));
                     }
                 }
@@ -582,9 +586,9 @@
 
         try {
             if (instance == null) {
-                m_updated.call(new Object[] {props});
+                m_updated.call(new Object[]{props});
             } else {
-                m_updated.call(instance, new Object[] {props});
+                m_updated.call(instance, new Object[]{props});
             }
         } catch (Exception e) {
             error("Cannot call the updated method " + m_updated.getMethod() + " : " + e.getMessage());
@@ -595,12 +599,14 @@
      * Managed Service method.
      * This method is called when the instance is reconfigured by the ConfigurationAdmin.
      * When called, it must hold the monitor lock.
+     *
      * @param conf : pushed configuration.
-     * @throws org.osgi.service.cm.ConfigurationException the reconfiguration failed.
+     * @throws org.osgi.service.cm.ConfigurationException
+     *          the reconfiguration failed.
      * @see org.osgi.service.cm.ManagedService#updated(java.util.Dictionary)
      */
     public synchronized void updated(Dictionary conf) throws org.osgi.service.cm.ConfigurationException {
-        if (conf == null && ! m_configurationAlreadyPushed) {
+        if (conf == null && !m_configurationAlreadyPushed) {
             return; // First call
         } else if (conf != null) { // Configuration push
             Properties props = reconfigureProperties(conf);
@@ -624,6 +630,7 @@
 
     /**
      * Gets the configuration handler description.
+     *
      * @return the configuration handler description.
      * @see org.apache.felix.ipojo.Handler#getDescription()
      */
