diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
index 300482a..7c745ed 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
@@ -443,9 +443,11 @@
 
     /**
      * Invokes the updated method.
-     * This method build the dictionary containing all valued properties.
+     * 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 exisiting
+     * If <code>null</code> the callback is called on all the existing
      * object.
      */
     private void notifyUpdated(Object instance) {
@@ -460,6 +462,31 @@
                 props.put(n, v);
             }
         }
+        // add propagated properties to the list if propagation enable
+        if (m_mustPropagate) {
+            // Start by properties from the configuration admin,
+            if (m_propagatedFromCA != null) {
+
+                Enumeration e = m_propagatedFromCA.keys();
+                while (e.hasMoreElements()) {
+                    String k = (String) e.nextElement();
+                    if (! k.equals("instance.name")) {
+                        props.put(k, m_propagatedFromCA.get(k));
+                    }
+                }
+            }
+            // Do also the one from the instance configuration
+            if (m_propagatedFromInstance != null) {
+                Enumeration e = m_propagatedFromInstance.keys();
+                while (e.hasMoreElements()) {
+                    String k = (String) e.nextElement();
+                    if (! k.equals("instance.name")) { // Skip instance.name
+                        props.put(k, m_propagatedFromInstance.get(k));
+                    }
+                }
+            }
+        }
+
         try {
             if (instance == null) {
                 m_updated.call(new Object[] {props});
diff --git a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethod.java b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethod.java
index 9ec6af2..a204deb 100644
--- a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethod.java
+++ b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethod.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -28,18 +28,18 @@
 import org.osgi.framework.ServiceReference;
 
 public class UpdatedMethod extends OSGiTestCase {
-	
+
 	ComponentInstance fooProvider1;
 	ComponentInstance fooProvider2;
 	ComponentInstance fooProvider3;
-	
+
 	public void setUp() {
 		String type = "CONFIG-FooProviderType-ConfUpdated";
-		
+
 		Properties p1 = new Properties();
 		p1.put("instance.name","FooProvider-1");
 		fooProvider1 = Utils.getComponentInstance(getContext(), type, p1);
-		
+
 		Properties p2 = new Properties();
 		p2.put("instance.name","FooProvider-2");
 		p2.put("int", new Integer(4));
@@ -48,12 +48,12 @@
 		p2.put("strAProp", new String[] {"bar", "foo"});
 		p2.put("intAProp", new int[] {1, 2, 3});
 		fooProvider2 = Utils.getComponentInstance(getContext(), type, p2);
-		
+
 		Properties p3 = new Properties();
         p3.put("instance.name","FooProvider-3");
         fooProvider3 = Utils.getComponentInstance(getContext(), "CONFIG-FooProviderType-ConfNoValueUpdated", p3);
 	}
-	
+
 	public void tearDown() {
 		fooProvider1.dispose();
 		fooProvider2.dispose();
@@ -62,23 +62,23 @@
 		fooProvider2 = null;
 		fooProvider3 = null;
 	}
-	
+
 	public void testComponentTypeConfiguration() {
 		ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check FooService availability", ref);
 		FooService fs = (FooService) getContext().getService(ref);
 		Properties toCheck = fs.fooProps();
-		
+
 		Integer intProp = (Integer) toCheck.get("intProp");
 		Boolean boolProp = (Boolean) toCheck.get("boolProp");
 		String strProp = (String) toCheck.get("strProp");
 		String[] strAProp = (String[]) toCheck.get("strAProp");
 		int[] intAProp = (int[]) toCheck.get("intAProp");
-		
+
 		// Check updated
 		Integer updated = (Integer) toCheck.get("updated");
 		Dictionary dict = (Dictionary) toCheck.get("lastupdated");
-		
+
 		assertEquals("Check intProp equality (1)", intProp, new Integer(2));
 		assertEquals("Check longProp equality (1)", boolProp, new Boolean(false));
 		assertEquals("Check strProp equality (1)", strProp, new String("foo"));
@@ -92,26 +92,26 @@
 		for (int i = 0; i < intAProp.length; i++) {
 			if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality (1) : " + intAProp[i] + " != " + v2[i]); }
 		}
-		
+
 		assertEquals("updated count ", 1, updated.intValue());
 		assertEquals("Last updated", 5, dict.size());
-		
+
 		// change the field value
 		assertTrue("Invoke the fs service", fs.foo());
 		toCheck = fs.fooProps();
-		
-		
+
+
 		//	Re-check the property (change)
 		intProp = (Integer) toCheck.get("intProp");
 		boolProp = (Boolean) toCheck.get("boolProp");
 		strProp = (String) toCheck.get("strProp");
 		strAProp = (String[]) toCheck.get("strAProp");
 		intAProp = (int[]) toCheck.get("intAProp");
-		
+
 		// Check updated
         updated = (Integer) toCheck.get("updated");
         dict = (Dictionary) toCheck.get("lastupdated");
-		
+
 		assertEquals("Check intProp equality (2) ("+intProp+")", intProp, new Integer(3));
 		assertEquals("Check longProp equality (2)", boolProp, new Boolean(true));
 		assertEquals("Check strProp equality (2)", strProp, new String("bar"));
@@ -125,55 +125,55 @@
 		for (int i = 0; i < intAProp.length; i++) {
 			if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality (2) : " + intAProp[i] + " != " + v2[i]); }
 		}
-		
+
 		// This does not reconfigure...
         assertEquals("updated count -2 ", 1, updated.intValue());
         assertEquals("Last update - 2", 5, dict.size());
-        		
+
 		fs = null;
 		getContext().ungetService(ref);
 	}
-	
+
 	public void testNoValue() {
         ServiceReference sr = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), "FooProvider-3");
         assertNotNull("Check the availability of the FS service", sr);
-        
+
         FooService fs = (FooService) getContext().getService(sr);
         Properties toCheck = fs.fooProps();
-        
+
         // Check service properties
         Integer intProp = (Integer) toCheck.get("intProp");
         Boolean boolProp = (Boolean) toCheck.get("boolProp");
         String strProp = (String) toCheck.get("strProp");
         String[] strAProp = (String[]) toCheck.get("strAProp");
         int[] intAProp = (int[]) toCheck.get("intAProp");
-        
+
         // Check updated
         Integer updated = (Integer) toCheck.get("updated");
         Dictionary dict = (Dictionary) toCheck.get("lastupdated");
-        
+
         assertEquals("Check intProp equality", intProp, new Integer(0));
         assertEquals("Check longProp equality", boolProp, new Boolean(false));
         assertEquals("Check strProp equality", strProp, null);
         assertNull("Check strAProp nullity", strAProp);
         assertNull("Check intAProp  nullity", intAProp);
-        
+
         assertEquals("updated count ", 1, updated.intValue());
         assertEquals("Last update", 0, dict.size());
-       
+
         assertTrue("invoke fs", fs.foo());
         toCheck = fs.fooProps();
-        
+
         // Re-check the property (change)
         intProp = (Integer) toCheck.get("intProp");
         boolProp = (Boolean) toCheck.get("boolProp");
         strProp = (String) toCheck.get("strProp");
         strAProp = (String[]) toCheck.get("strAProp");
         intAProp = (int[]) toCheck.get("intAProp");
-        
+
         updated = (Integer) toCheck.get("updated");
         dict = (Dictionary) toCheck.get("lastupdated");
-        
+
         assertEquals("Check intProp equality", intProp, new Integer(3));
         assertEquals("Check longProp equality", boolProp, new Boolean(true));
         assertEquals("Check strProp equality", strProp, new String("bar"));
@@ -187,9 +187,10 @@
         for (int i = 0; i < intAProp.length; i++) {
             if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
         }
-        
+
         fs = null;
-        getContext().ungetService(sr);   
+        getContext().ungetService(sr);
     }
 
+
 }
diff --git a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedService.java b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedService.java
index fe70f31..0c78e26 100644
--- a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedService.java
+++ b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedService.java
@@ -118,7 +118,7 @@
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
 
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
+        assertEquals("Check last updated", 3, dict.size());
 
         context.ungetService(fooRef);
 		getContext().ungetService(msRef);
@@ -163,7 +163,7 @@
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
 
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
+        assertEquals("Check last updated", 3, dict.size());
 
         conf.put("baz", "zab2");
         conf.put("foo", "oof2");
@@ -177,7 +177,7 @@
         dict = (Dictionary) fs.fooProps().get("lastupdated");
 
         assertEquals("Check updated -2", 2, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
+        assertEquals("Check last updated", 3, dict.size());
 
         getContext().ungetService(fooRef);
         getContext().ungetService(msRef);
@@ -231,7 +231,7 @@
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
 
         assertEquals("Check updated -1", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
+        assertEquals("Check last updated", 3, dict.size());
 
         conf.put("baz", "zab2");
         conf.put("foo", "oof2");
@@ -245,7 +245,7 @@
         dict = (Dictionary) fs.fooProps().get("lastupdated");
 
         assertEquals("Check updated -2", 2, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
+        assertEquals("Check last updated", 3, dict.size());
 
 
     	getContext().ungetService(fooRef);
@@ -301,7 +301,7 @@
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
 
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
+        assertEquals("Check last updated", 3, dict.size());
 
         conf.put("baz", "zab2");
         conf.put("foo", "oof2");
@@ -315,7 +315,7 @@
         dict = (Dictionary) fs.fooProps().get("lastupdated");
 
         assertEquals("Check updated -2", 2, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
+        assertEquals("Check last updated", 3, dict.size());
 
         getContext().ungetService(fooRef);
         getContext().ungetService(msRef);
diff --git a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedServiceFactory.java b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedServiceFactory.java
index 4a8e5c1..f9289c7 100644
--- a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedServiceFactory.java
+++ b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/UpdatedMethodAndManagedServiceFactory.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -32,31 +32,32 @@
 public class UpdatedMethodAndManagedServiceFactory extends OSGiTestCase {
 
 	ComponentInstance instance, instance2;
-	
+
 	public void setUp() {
 		String type = "CONFIG-FooProviderType-3Updated";
-		
+
 		Properties p1 = new Properties();
 		p1.put("instance.name","instance");
 		p1.put("foo", "foo");
 		p1.put("bar", "2");
 		p1.put("baz", "baz");
 		instance = Utils.getComponentInstance(getContext(), type, p1);
-		
+
 		Properties p2 = new Properties();
         p2.put("instance.name","instance2");
 
         instance2 = Utils.getComponentInstance(getContext(), type, p2);
 	}
-	
+
 	public void tearDown() {
 		instance.dispose();
 		instance2.dispose();
 		instance2 = null;
 		instance = null;
 	}
-	
+
 	public void testStatic() {
+
 		ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
 		assertNotNull("Check FS availability", fooRef);
 		String fooP = (String) fooRef.getProperty("foo");
@@ -65,11 +66,11 @@
 		assertEquals("Check foo equality -1", fooP, "foo");
 		assertEquals("Check bar equality -1", barP, new Integer(2));
 		assertEquals("Check baz equality -1", bazP, "baz");
-		
+
 		ServiceReference msRef = Utils.getServiceReferenceByName(getContext(), ManagedServiceFactory.class.getName(), instance.getFactory().getName());
 		assertNotNull("Check ManagedServiceFactory availability", msRef);
-		
-		
+
+
 		// Configuration of baz
 		Properties conf = new Properties();
 		conf.put("baz", "zab");
@@ -79,7 +80,7 @@
 		try {
 			ms.updated(instance.getInstanceName(), conf);
 		} catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
-		
+
 		// Recheck props
 		fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
 		fooP = (String) fooRef.getProperty("foo");
@@ -88,18 +89,20 @@
 		assertEquals("Check foo equality -2", fooP, "foo");
 		assertEquals("Check bar equality -2", barP, new Integer(2));
 		assertEquals("Check baz equality -2", bazP, "zab");
-		
+
 		 // Get Service
         FooService fs = (FooService) context.getService(fooRef);
         Integer updated = (Integer) fs.fooProps().get("updated");
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
-        
+
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
-        
+        System.out.println("Dictionary : " + dict);
+        assertEquals("Check last updated", 3, dict.size()); // foo bar and baz as a service prooperties.
+
 		getContext().ungetService(msRef);
+
 	}
-	
+
 	public void testStaticNoValue() {
         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());
         assertNotNull("Check FS availability", fooRef);
@@ -109,11 +112,11 @@
         assertEquals("Check foo equality -1", fooP, null);
         assertEquals("Check bar equality -1", barP, null);
         assertEquals("Check baz equality -1", bazP, null);
-        
+
         ServiceReference msRef = Utils.getServiceReferenceByName(getContext(), ManagedServiceFactory.class.getName(), instance2.getFactory().getName());
         assertNotNull("Check ManagedServiceFactory availability", msRef);
-        
-        
+
+
         // Configuration of baz
         Properties conf = new Properties();
         conf.put("baz", "zab");
@@ -123,7 +126,7 @@
         try {
             ms.updated(instance2.getInstanceName(), conf);
         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
-        
+
         // Recheck props
         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());
         fooP = (String) fooRef.getProperty("foo");
@@ -132,33 +135,33 @@
         assertEquals("Check foo equality -2", fooP, "foo");
         assertEquals("Check bar equality -2", barP, new Integer(2));
         assertEquals("Check baz equality -2", bazP, "zab");
-        
+
         // Get Service
         FooService fs = (FooService) context.getService(fooRef);
         Integer updated = (Integer) fs.fooProps().get("updated");
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
-        
+
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
-        
+        assertEquals("Check last updated", 3, dict.size());
+
         getContext().ungetService(msRef);
     }
-	
+
 	public void testDynamic() {
     	ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
     	assertNotNull("Check FS availability", fooRef);
-    	
+
     	String fooP = (String) fooRef.getProperty("foo");
     	Integer barP = (Integer) fooRef.getProperty("bar");
     	String bazP = (String) fooRef.getProperty("baz");
-    	
+
     	assertEquals("Check foo equality", fooP, "foo");
     	assertEquals("Check bar equality", barP, new Integer(2));
     	assertEquals("Check baz equality", bazP, "baz");
-    	
+
     	ServiceReference msRef = Utils.getServiceReferenceByName(getContext(), ManagedServiceFactory.class.getName(), instance.getFactory().getName());
     	assertNotNull("Check ManagedServiceFactory availability", msRef);
-    	
+
     	// Configuration of baz
     	Properties conf = new Properties();
     	conf.put("baz", "zab");
@@ -168,50 +171,50 @@
     	try {
     		ms.updated(instance.getInstanceName(), conf);
     	} catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
-    	
+
     	// Recheck props
     	fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
     	fooP = (String) fooRef.getProperty("foo");
     	barP = (Integer) fooRef.getProperty("bar");
     	bazP = (String) fooRef.getProperty("baz");
-    	
+
     	assertEquals("Check foo equality", fooP, "oof");
     	assertEquals("Check bar equality", barP, new Integer(0));
     	assertEquals("Check baz equality", bazP, "zab");
-    	
+
     	// Check field value
     	FooService fs = (FooService) getContext().getService(fooRef);
     	Properties p = fs.fooProps();
     	fooP = (String) p.get("foo");
     	barP = (Integer) p.get("bar");
-    	
+
     	assertEquals("Check foo field equality", fooP, "oof");
     	assertEquals("Check bar field equality", barP, new Integer(0));
-    	
+
         Integer updated = (Integer) fs.fooProps().get("updated");
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
-        
+
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
-    	
+        assertEquals("Check last updated", 3, dict.size());
+
     	getContext().ungetService(fooRef);
     	getContext().ungetService(msRef);
     }
-	
+
 	public void testDynamicNoValue() {
         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());
         assertNotNull("Check FS availability", fooRef);
-        
+
         Object fooP = fooRef.getProperty("foo");
         Object barP = fooRef.getProperty("bar");
         Object bazP = fooRef.getProperty("baz");
         assertEquals("Check foo equality -1", fooP, null);
         assertEquals("Check bar equality -1", barP, null);
         assertEquals("Check baz equality -1", bazP, null);
-        
+
         ServiceReference msRef = Utils.getServiceReferenceByName(getContext(), ManagedServiceFactory.class.getName(), instance2.getFactory().getName());
         assertNotNull("Check ManagedServiceFactory availability", msRef);
-        
+
         // Configuration of baz
         Properties conf = new Properties();
         conf.put("baz", "zab");
@@ -221,33 +224,33 @@
         try {
             ms.updated(instance2.getInstanceName(), conf);
         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
-        
+
         // Recheck props
         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());
         fooP = (String) fooRef.getProperty("foo");
         barP = (Integer) fooRef.getProperty("bar");
         bazP = (String) fooRef.getProperty("baz");
-        
+
         assertEquals("Check foo equality", fooP, "oof");
         assertEquals("Check bar equality", barP, new Integer(0));
         assertEquals("Check baz equality", bazP, "zab");
-        
+
         // Check field value
         FooService fs = (FooService) getContext().getService(fooRef);
         Properties p = fs.fooProps();
         fooP = (String) p.get("foo");
         barP = (Integer) p.get("bar");
-        
+
         assertEquals("Check foo field equality", fooP, "oof");
         assertEquals("Check bar field equality", barP, new Integer(0));
-        
+
         Integer updated = (Integer) fs.fooProps().get("updated");
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
-        
+
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
-        
-        
+        assertEquals("Check last updated", 3, dict.size());
+
+
         getContext().ungetService(fooRef);
         getContext().ungetService(msRef);
     }
@@ -256,18 +259,18 @@
     public void testDynamicString() {
 		ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
 		assertNotNull("Check FS availability", fooRef);
-		
+
 		String fooP = (String) fooRef.getProperty("foo");
 		Integer barP = (Integer) fooRef.getProperty("bar");
 		String bazP = (String) fooRef.getProperty("baz");
-		
+
 		assertEquals("Check foo equality", fooP, "foo");
 		assertEquals("Check bar equality", barP, new Integer(2));
 		assertEquals("Check baz equality", bazP, "baz");
-		
+
 		ServiceReference msRef = Utils.getServiceReferenceByName(getContext(), ManagedServiceFactory.class.getName(), instance.getFactory().getName());
 		assertNotNull("Check ManagedServiceFactory availability", msRef);
-		
+
 		// Configuration of baz
 		Properties conf = new Properties();
 		conf.put("baz", "zab");
@@ -277,33 +280,33 @@
 		try {
 			ms.updated(instance.getInstanceName(), conf);
 		} catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
-		
+
 		// Recheck props
 		fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
 		fooP = (String) fooRef.getProperty("foo");
 		barP = (Integer) fooRef.getProperty("bar");
 		bazP = (String) fooRef.getProperty("baz");
-		
+
 		assertEquals("Check foo equality", fooP, "oof");
 		assertEquals("Check bar equality", barP, new Integer(0));
 		assertEquals("Check baz equality", bazP, "zab");
-		
+
 		// Check field value
 		FooService fs = (FooService) getContext().getService(fooRef);
 		Properties p = fs.fooProps();
 		fooP = (String) p.get("foo");
 		barP = (Integer) p.get("bar");
-		
+
 		assertEquals("Check foo field equality", fooP, "oof");
 		assertEquals("Check bar field equality", barP, new Integer(0));
-		
+
 		Integer updated = (Integer) fs.fooProps().get("updated");
         Dictionary dict = (Dictionary) fs.fooProps().get("lastupdated");
-        
+
         assertEquals("Check updated", 1, updated.intValue());
-        assertEquals("Check last updated", 2, dict.size());
-        
-		
+        assertEquals("Check last updated", 3, dict.size());
+
+
 		getContext().ungetService(fooRef);
 		getContext().ungetService(msRef);
 	}
