diff --git a/ipojo/examples/pom.xml b/ipojo/examples/pom.xml
index 412d598..3284bd7 100644
--- a/ipojo/examples/pom.xml
+++ b/ipojo/examples/pom.xml
@@ -26,25 +26,4 @@
   <modules>
 	<module>tutorial-maven</module>
   </modules>
-  
-  <profiles>
-	<profile>
-		<id>java5</id>
-		<activation>
-			<jdk>1.5</jdk>
-		</activation>
-		<modules>
-			<module>property-handler</module>
-		</modules>
-	</profile>
-	<profile>
-		<id>java6</id>
-		<activation>
-			<jdk>1.6</jdk>
-		</activation>
-		<modules>
-			<module>property-handler</module>
-		</modules>
-	</profile>
-  </profiles>
 </project>
\ No newline at end of file
diff --git a/ipojo/examples/property-handler/PropertyHandler/metadata.xml b/ipojo/examples/property-handler/PropertyHandler/metadata.xml
deleted file mode 100644
index 48d7bef..0000000
--- a/ipojo/examples/property-handler/PropertyHandler/metadata.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<ipojo xmlns:props="example.handler.properties">
-
-	<!-- Declare the handler -->
-	<handler name="properties" namespace="example.handler.properties"
-		classname="org.apache.felix.ipojo.handler.properties.PropertiesHandler">
-		<!--  the properties handler does not use any other handler -->
-	</handler>
-
-</ipojo>
diff --git a/ipojo/examples/property-handler/PropertyHandler/pom.xml b/ipojo/examples/property-handler/PropertyHandler/pom.xml
deleted file mode 100644
index 6942760..0000000
--- a/ipojo/examples/property-handler/PropertyHandler/pom.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<!--
-  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
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-  http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <packaging>bundle</packaging>
-  <name>Apache Felix iPOJO Property Handler</name>
-  <artifactId>
-    org.apache.felix.ipojo.example.handler.property
-  </artifactId>
-  <groupId>ipojo.examples</groupId>
-  <version>1.5.0-SNAPSHOT</version>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.apache.felix.ipojo</artifactId>
-      <version>1.9.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.apache.felix.ipojo.metadata</artifactId>
-      <version>1.4.0</version>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <version>1.4.3</version>
-        <extensions>true</extensions>
-        <configuration>
-          <instructions>
-            <Private-Package>
-              org.apache.felix.ipojo.handler.properties,
-              example.handler.properties
-            </Private-Package>
-          </instructions>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-ipojo-plugin</artifactId>
-        <version>1.9.0-SNAPSHOT</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>ipojo-bundle</goal>
-            </goals>
-            <configuration>
-              <ignoreAnnotations>true</ignoreAnnotations>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/ipojo/examples/property-handler/PropertyHandler/src/main/java/example/handler/properties/Properties.java b/ipojo/examples/property-handler/PropertyHandler/src/main/java/example/handler/properties/Properties.java
deleted file mode 100644
index 9144bb8..0000000
--- a/ipojo/examples/property-handler/PropertyHandler/src/main/java/example/handler/properties/Properties.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* 
- * 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
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package example.handler.properties;
-
-/**
- * The Properties annotation.
- * This annotation may be used in POJO class to used the Property handler.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public @interface Properties {
-    
-    /**
-     * Returns the property file used by the handler.
-     */
-    String file();
-
-}
diff --git a/ipojo/examples/property-handler/PropertyHandler/src/main/java/org/apache/felix/ipojo/handler/properties/PropertiesHandler.java b/ipojo/examples/property-handler/PropertyHandler/src/main/java/org/apache/felix/ipojo/handler/properties/PropertiesHandler.java
deleted file mode 100644
index abd3583..0000000
--- a/ipojo/examples/property-handler/PropertyHandler/src/main/java/org/apache/felix/ipojo/handler/properties/PropertiesHandler.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/* 
- * 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
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.ipojo.handler.properties;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Properties;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.PrimitiveHandler;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.FieldMetadata;
-import org.apache.felix.ipojo.parser.PojoMetadata;
-
-/**
- * This handler load a properties file containing property value. The handler injects this values inside fields. When stopping the handler stores
- * updated value inside the file. The properties file contains [field-name: field-value] (field-value are strings) Metadata :
- * &lt;example.handler.properties:properties file="file-path"&gt; Instances can override file locations by setting the properties.file property.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class PropertiesHandler extends PrimitiveHandler {
-    
-    /** The Handler NAMESPACE. */
-    private final String NAMESPACE = "example.handler.properties";
-
-    /** Properties file. */
-    private Properties m_properties = new Properties();
-
-    /** File location. */
-    private String m_file;
-
-    /**
-     * This method is the first to be invoked. This method aims to configure the handler. It receives the component type metadata and the instance
-     * description. The method parses given metadata and register field to listen. Step 3 : when the instance configuration contains the
-     * properties.file property, it overrides the properties file location.
-     * @param metadata : component type metadata
-     * @param configuration : instance description
-     * @throws ConfigurationException : the configuration of the handler has failed.
-     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
-     */
-    @SuppressWarnings("unchecked")
-    public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
-        // Parse metadata to get <properties file="$file"/>
-
-        Element[] elem = metadata.getElements("properties", NAMESPACE); // Get all example.handler.properties:properties element
-
-        switch (elem.length) {
-            case 0:
-                // No matching element in metadata, throw a configuration error.
-                throw new ConfigurationException("No properties found");
-            case 1:
-                // One 'properties' found, get attributes.
-                m_file = elem[0].getAttribute("file");
-                if (m_file == null) {
-                    // if file is null, throw a configuration error.
-                    throw new ConfigurationException("Malformed properties element : file attribute must be set");
-                }
-                break;
-            default:
-                // To simplify we handle only one properties element.
-                throw new ConfigurationException("Only one properties element is supported");
-        }
-
-        // Look if the instance overrides file location :
-        String instanceFile = (String) configuration.get("properties.file");
-        if (instanceFile != null) {
-            m_file = instanceFile;
-        }
-
-        // Load properties
-        try {
-            loadProperties();
-        } catch (IOException e) {
-            throw new ConfigurationException("Error when reading the " + m_file + " file : " + e.getMessage());
-        }
-
-        // Register fields
-        // By convention, properties file entry are field name, so look for each property to get field list.
-
-        //First get Pojo Metadata metadata :
-        PojoMetadata pojoMeta = getPojoMetadata();
-        Enumeration e = m_properties.keys();
-        while (e.hasMoreElements()) {
-            String field = (String) e.nextElement();
-            FieldMetadata fm = pojoMeta.getField(field);
-
-            if (fm == null) { // The field does not exist
-                throw new ConfigurationException("The field " + field + " is declared in the properties file but does not exist in the pojo");
-            }
-
-            // Then check that the field is a String field
-            if (!fm.getFieldType().equals(String.class.getName())) {
-                throw new ConfigurationException("The field " + field + " exists in the pojo, but is not a String");
-            }
-
-            // All checks are ok, register the interceptor.
-            getInstanceManager().register(fm, this);
-        }
-
-        // Finally register the field to listen 
-    }
-
-    /**
-     * This method is called when the instance start (after the configure method). We just print stored properties.
-     * @see org.apache.felix.ipojo.Handler#start()
-     */
-    public void start() {
-        // The properties are already loaded (in the configure method), just print values.
-        m_properties.list(System.out);
-    }
-
-    /**
-     * This method is called when the instance stops. We save the properties to not lost the instance state and clear the stored properties.
-     * @see org.apache.felix.ipojo.Handler#stop()
-     */
-    public void stop() {
-        try {
-            saveProperties();
-        } catch (IOException e) {
-            error("Cannot read the file : " + m_file, e); // Log an error message by using the iPOJO logger
-        }
-        m_properties = null;
-    }
-
-    /**
-     * This method is called at each time the pojo 'get' a listened field. The method return the stored value.
-     * @param pojo : pojo object getting the field
-     * @param field : field name.
-     * @param o : previous value.
-     * @return the stored value.
-     * @see org.apache.felix.ipojo.PrimitiveHandler#getterCallback(java.lang.String, java.lang.Object)
-     */
-    public Object onGet(Object pojo, String field, Object o) {
-        // When the pojo requires a value for a managed field, this method is invoked.
-        // So, we have just to return the stored value.
-        return m_properties.get(field);
-    }
-
-    /**
-     * This method is called at each time the pojo 'set' a listened field. This method updates the local properties.
-     * @param pojo : pojo object setting the field
-     * @param field : field name
-     * @param newvalue : new value
-     * @see org.apache.felix.ipojo.PrimitiveHandler#setterCallback(java.lang.String, java.lang.Object)
-     */
-    public void onSet(Object pojo, String field, Object newvalue) {
-        // When the pojo set a value to a managed field, this method is invoked.
-        // So, we update the stored value.
-        m_properties.put(field, newvalue);
-    }
-
-    /**
-     * Step 2 : state properties when the instance becomes invalid.
-     * @param newState : the instance state
-     * @see org.apache.felix.ipojo.Handler#stateChanged(int)
-     */
-    public void stateChanged(int newState) {
-        // This method is invoked each times that the instance state changed.
-
-        // If the new state is invalid, save the properties.
-        if (newState == ComponentInstance.INVALID) {
-            // Reload properties
-            try {
-                saveProperties();
-            } catch (IOException e) {
-                error("Cannot read the file : " + m_file, e); // Log an error message by using the iPOJO logger
-            }
-            return;
-        }
-    }
-
-    /**
-     * Step 5 : dynamic reconfiguration. This method is call when the instance is reconfigured externally. The given property contains property value.
-     * @param dict : new properties
-     * @see org.apache.felix.ipojo.Handler#reconfigure(java.util.Dictionary)
-     */
-    @SuppressWarnings("unchecked")
-    public synchronized void reconfigure(Dictionary dict) {
-        // For each property, look if a new value is contained in the new configuration.
-        Enumeration e = m_properties.keys();
-        while (e.hasMoreElements()) {
-            String field = (String) e.nextElement();
-            String value = (String) dict.get(field);
-            // If the dictionary contains a value, update the stored value.
-            if (value != null) {
-                m_properties.put(field, value);
-            }
-        }
-    }
-
-    /**
-     * Returns handler description.
-     * @return the handler description.
-     * @see org.apache.felix.ipojo.Handler#getDescription()
-     */
-    public HandlerDescription getDescription() {
-        return new Description(this);
-    }
-
-    /**
-     * Helper method just loading the properties.
-     * @throws IOException : the file cannot be read.
-     */
-    private void loadProperties() throws IOException {
-        // Load the properties file from file system
-        File file = new File(m_file);
-        InputStream is = new FileInputStream(file);
-        m_properties.load(is);
-    }
-
-    /**
-     * Helper method writing properties.
-     * @throws IOException : the file cannot be written.
-     */
-    private void saveProperties() throws IOException {
-        // Store the file, modified the last modification date.
-        File file = new File(m_file);
-        OutputStream os = new FileOutputStream(file);
-        m_properties.store(os, "");
-    }
-
-    /**
-     * Step 3 : The handler will participate to the instance architecture. 
-     * This class describing the handler.
-     */
-    private class Description extends HandlerDescription {
-
-        /**
-         * Instantiates a new description.
-         * @param h the h
-         */
-        public Description(PrimitiveHandler h) {
-            super(h);
-        }
-
-        /**
-         * This method must return the Element describing the handler. The description of this handler contains the list of properties with attached
-         * value.
-         * @return the description of the handler.
-         * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
-         */
-        @SuppressWarnings("unchecked")
-        public Element getHandlerInfo() {
-            Element elem = super.getHandlerInfo(); // This method must be called to get the root description element.
-            Enumeration e = m_properties.keys();
-            while (e.hasMoreElements()) {
-                String field = (String) e.nextElement();
-                Element prop = new Element("property", ""); // Create an element for the actual property.
-                // Add two attribute (the field and the value).
-                prop.addAttribute(new Attribute("field", field));
-                prop.addAttribute(new Attribute("value", (String) m_properties.get(field)));
-                elem.addElement(prop); // Attach the current element to the root element.
-            }
-            return elem;
-        }
-
-    }
-}
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/metadata.xml b/ipojo/examples/property-handler/PropertyHandlerTest/metadata.xml
deleted file mode 100644
index dcc9c16..0000000
--- a/ipojo/examples/property-handler/PropertyHandlerTest/metadata.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<ipojo xmlns:props="example.handler.properties">
-
-	<!-- Declare a component using your handler -->
-	<component
-		classname="org.apache.felix.ipojo.handler.properties.example.PropertiesTester">
-		<callback transition="validate" method="start" />
-		<callback transition="invalidate" method="stop" />
-		<!--  declare our handler -->
-		<props:properties file="props\properties.txt" />
-	</component>
-
-	<!-- Declare an instance -->
-	<instance component="annotationTester" />
-	<instance
-		component="org.apache.felix.ipojo.handler.properties.example.PropertiesTester"
-		name="i1">
-		<property name="properties.file"
-			value="props\properties-i1.txt" />
-	</instance>
-
-</ipojo>
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/pom.xml b/ipojo/examples/property-handler/PropertyHandlerTest/pom.xml
deleted file mode 100644
index 2627cec..0000000
--- a/ipojo/examples/property-handler/PropertyHandlerTest/pom.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<!--
-  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
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-  http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <packaging>bundle</packaging>
-  <name>Apache Felix iPOJO Property Handler Test</name>
-  <artifactId>
-    org.apache.felix.ipojo.example.handler.property.test
-  </artifactId>
-  <groupId>ipojo.examples</groupId>
-  <version>1.5.0-SNAPSHOT</version>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.apache.felix.ipojo.annotations</artifactId>
-      <version>1.9.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>ipojo.examples</groupId>
-      <artifactId>
-        org.apache.felix.ipojo.example.handler.property
-      </artifactId>
-      <version>1.5.0-SNAPSHOT</version>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <version>1.4.3</version>
-        <extensions>true</extensions>
-        <configuration>
-          <instructions>
-            <Private-Package>
-              org.apache.felix.ipojo.handler.properties.example
-            </Private-Package>
-          </instructions>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-ipojo-plugin</artifactId>
-        <version>1.9.0-SNAPSHOT</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>ipojo-bundle</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/props/properties-i1.txt b/ipojo/examples/property-handler/PropertyHandlerTest/props/properties-i1.txt
deleted file mode 100644
index 7d688d2..0000000
--- a/ipojo/examples/property-handler/PropertyHandlerTest/props/properties-i1.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-#Sun Nov 18 20:33:54 CET 2007
-m_property2=foo - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
-m_property1=bar - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/props/properties.txt b/ipojo/examples/property-handler/PropertyHandlerTest/props/properties.txt
deleted file mode 100644
index 2d46de8..0000000
--- a/ipojo/examples/property-handler/PropertyHandlerTest/props/properties.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-#Sun Nov 18 20:33:54 CET 2007
-m_property2=prop2 - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
-m_property1=prop1 - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/AnnotationPropertiesTester.java b/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/AnnotationPropertiesTester.java
deleted file mode 100644
index 0f3df8d..0000000
--- a/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/AnnotationPropertiesTester.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/* 
- * 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
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.ipojo.handler.properties.example;
-
-import java.text.DateFormat;
-import java.util.Date;
-
-import org.apache.felix.ipojo.annotations.Component;
-import org.apache.felix.ipojo.annotations.Invalidate;
-import org.apache.felix.ipojo.annotations.Validate;
-
-import example.handler.properties.Properties;
-
-/**
- * A simple component implementation using the property handler.
- *@author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@Component(name = "annotationTester")
-@Properties(file = "props\\properties.txt")
-public class AnnotationPropertiesTester {
- 
-    /**
-     * Property 1 : injected. 
-     */
-    private String m_property1;
-
-    /**
-     * Property 1 : injected. 
-     */
-    private String m_property2;
-
-    /**
-     * Start method : 
-     * displays loaded & injected properties before modifying them.
-     */
-    @Validate
-    public void start() {
-        System.out.println("AnnotationPropertiesTester is starting ...");
-        System.out.println("Property 1 : " + m_property1);
-        System.out.println("Property 2 : " + m_property2);
-
-        updateProperties();
-    }
-
-    /**
-     * Stop method :
-     * displays properties values.
-     */
-    @Invalidate
-    public void stop() {
-        System.out.println("AnnotationPropertiesTester is stopping ...");
-        System.out.println("Property 1 : " + m_property1);
-        System.out.println("Property 2 : " + m_property2);
-    }
-
-    /**
-     * Update property value.
-     */
-    private void updateProperties() {
-        System.out.println("Update properties");
-        Date date = new Date();
-        DateFormat df = DateFormat.getDateTimeInstance();
-        m_property1 = m_property1 + " - " + df.format(date);
-        m_property2 = m_property2 + " - " + df.format(date);
-
-    }
-}
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/PropertiesTester.java b/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/PropertiesTester.java
deleted file mode 100644
index 37872db..0000000
--- a/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/PropertiesTester.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/* 
- * 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
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.ipojo.handler.properties.example;
-
-import java.text.DateFormat;
-import java.util.Date;
-
-public class PropertiesTester {
-    
-    // These two fields will be injected. 
-    private String property1;
-    private String property2;
-    
-    /**
-     * Starting method.
-     * This method will be called when the instance starts.
-     */
-    public void start() {
-        System.out.println("PropertiesTester is starting ...");
-        // Read the injected properties.
-        System.out.println("Property 1 : " + property1);
-        System.out.println("Property 2 : " + property2);
-        
-        // Update the properties.
-        updateProperties();
-    }
-    
-    /**
-     * Stopping method.
-     * This method will be called when the instance stops.
-     */
-    public void stop() {
-        System.out.println("PropertiesTester is stopping ...");
-        System.out.println("Property 1 : " + property1);
-        System.out.println("Property 2 : " + property2);
-    }
-
-    /**
-     * This method just updates managed properties.
-     * It appends the current date to the actual property value.
-     */
-    private void updateProperties() {
-        System.out.println("Update properties");
-       Date date = new Date();
-       DateFormat df = DateFormat.getDateTimeInstance();
-       // The properties will be updated in the property file
-       property1 = property1 + " - " + df.format(date);
-       property2 = property2 + " - " + df.format(date);
-        
-    }
-
-}
diff --git a/ipojo/examples/property-handler/pom.xml b/ipojo/examples/property-handler/pom.xml
deleted file mode 100644
index fd3fa28..0000000
--- a/ipojo/examples/property-handler/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
- 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
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>ipojo.examples.property.handler</artifactId>
-  <groupId>ipojo.examples</groupId>
-  <version>1.1.0-SNAPSHOT</version>
-  <name>Apache Felix iPOJO Property Handler</name>
-  <packaging>pom</packaging>
-
-  <profiles>
-	<profile>
-		<id>java5</id>
-		<activation>
-			<jdk>1.5</jdk>
-		</activation>
-		<modules>
-			<module>PropertyHandler</module>
-			<module>PropertyHandlerTest</module>
-		</modules>
-	</profile>
-	<profile>
-		<id>java6</id>
-		<activation>
-			<jdk>1.6</jdk>
-		</activation>
-		<modules>
-			<module>PropertyHandler</module>
-			<module>PropertyHandlerTest</module>
-		</modules>
-	</profile>
-  </profiles>
-</project>
\ No newline at end of file
diff --git a/ipojo/pom.xml b/ipojo/pom.xml
index eae697b..d4da67d 100644
--- a/ipojo/pom.xml
+++ b/ipojo/pom.xml
@@ -50,8 +50,8 @@
         <module>arch-gogo</module>
         <module>webconsole-plugin</module>
 
-        <!-- junit4osgi -->
-        <module>junit4osgi</module>
+        <!-- distribution and tutorials -->
+        <module>distributions</module>
     </modules>
 
     <profiles>
