diff --git a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Handler.java b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Handler.java
new file mode 100644
index 0000000..e2461ad
--- /dev/null
+++ b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Handler.java
@@ -0,0 +1,53 @@
+/*
+ * 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.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation declares a handler.
+ * This annotation is mandatory to declares an iPOJO handler.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@Target(ElementType.TYPE)
+public @interface Handler {
+
+    /**
+     * Name of the handler (required).
+     */
+    String name();
+
+    /**
+     * Namespace of the handler (required).
+     */
+    String namespace();
+
+    /**
+     * Start-level of the handler.
+     * Default: 1.
+     */
+    int level() default 1;
+
+    /**
+     * Enable / Disable the architecture exposition.
+     * Default : false
+     */
+    boolean architecture() default false;
+}
diff --git a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/HandlerDeclaration.java b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/HandlerDeclaration.java
new file mode 100644
index 0000000..242e928
--- /dev/null
+++ b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/HandlerDeclaration.java
@@ -0,0 +1,36 @@
+/*
+ * 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.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to configure a handler.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@Target(ElementType.TYPE)
+public @interface HandlerDeclaration {
+
+    /**
+     * The content of this attribute represents the XML 
+     * that would be used in the metadata.xml.
+     */
+    String value();
+}
diff --git a/ipojo/junit4osgi/maven-junit4osgi-plugin/pom.xml b/ipojo/junit4osgi/maven-junit4osgi-plugin/pom.xml
index 1909460..6555f44 100644
--- a/ipojo/junit4osgi/maven-junit4osgi-plugin/pom.xml
+++ b/ipojo/junit4osgi/maven-junit4osgi-plugin/pom.xml
@@ -41,7 +41,8 @@
     <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.apache.felix.framework</artifactId>
-      <version>1.8.1</version>
+      <!--  <version>1.8.1</version> -->
+      <version>2.0.0</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
diff --git a/ipojo/junit4osgi/maven-junit4osgi-plugin/src/main/java/org/apache/felix/ipojo/junit4osgi/plugin/Junit4osgiPlugin.java b/ipojo/junit4osgi/maven-junit4osgi-plugin/src/main/java/org/apache/felix/ipojo/junit4osgi/plugin/Junit4osgiPlugin.java
index c32af8c..953926b 100644
--- a/ipojo/junit4osgi/maven-junit4osgi-plugin/src/main/java/org/apache/felix/ipojo/junit4osgi/plugin/Junit4osgiPlugin.java
+++ b/ipojo/junit4osgi/maven-junit4osgi-plugin/src/main/java/org/apache/felix/ipojo/junit4osgi/plugin/Junit4osgiPlugin.java
@@ -47,6 +47,7 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -211,27 +212,29 @@
         felixConf.put("org.osgi.framework.storage.clean", "onFirstInit");
         felixConf.put("ipojo.log.level", "WARNING");
         // Use a boot delagation to share classes between the host and the embedded Felix.
-        // The junit.framework package is boot delegated to execute tests
-        // The log service package is also boot delegated as the host publish a log service
         // The cobertura package is used during code coverage collection
-        felixConf.put("org.osgi.framework.bootdelegation", "junit.framework, org.osgi.service.log, net.sourceforge.cobertura.coveragedata"); 
+        //felixConf.put("org.osgi.framework.bootdelegation", "net.sourceforge.cobertura.coveragedata"); 
+        felixConf.put("org.osgi.framework.system.packages.extra", "org.osgi.service.log;version=1.3, junit.framework;version=1.3");
+
+        //felixConf.put("org.osgi.framework.system.packages.extra", "org.osgi.service.log, junit.framework");
         
         felixConf.put("org.osgi.framework.storage", m_targetDir.getAbsolutePath() + "/felix-cache"); 
         
-        
+        felixConf.put(Constants.FRAMEWORK_BUNDLE_PARENT, Constants.FRAMEWORK_BUNDLE_PARENT_FRAMEWORK);
+
         if (configuration != null) {
             felixConf.putAll(configuration);
             // Check boot delegation
-            String bd = (String) felixConf.get("org.osgi.framework.bootdelegation");
-            if (bd.indexOf("junit.framework") == -1) {
-                bd.concat(", junit.framework");
-            }
-            if (bd.indexOf("org.osgi.service.log") == -1) {
-                bd.concat(", org.osgi.service.log");
-            }
-            if (bd.indexOf("net.sourceforge.cobertura.coveragedata") == -1) {
-                bd.concat(", net.sourceforge.cobertura.coveragedata");
-            }
+//            String bd = (String) felixConf.get("org.osgi.framework.bootdelegation");
+////            if (bd.indexOf("junit.framework") == -1) {
+////                bd.concat(", junit.framework");
+////            }
+////            if (bd.indexOf("org.osgi.service.log") == -1) {
+////                bd.concat(", org.osgi.service.log");
+////            }
+//            if (bd.indexOf("net.sourceforge.cobertura.coveragedata") == -1) {
+//                bd.concat(", net.sourceforge.cobertura.coveragedata");
+//            }
         }
         
         System.out.println("");
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java
index 6ecda0d..d989f70 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.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
@@ -18,11 +18,17 @@
  */
 package org.apache.felix.ipojo.manipulation.annotations;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 import org.objectweb.asm.AnnotationVisitor;
@@ -31,6 +37,10 @@
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.EmptyVisitor;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.NodeList;
 
 /**
  * Collect metadata from classes by parsing annotation.
@@ -47,7 +57,7 @@
     /**
      * Root element of computed metadata.
      */
-    private Element m_elem = new Element("component", "");
+    private Element m_elem = null;
 
     /**
      * True if the visited class is a component type declaration (i.e. contains the @component annotation).
@@ -67,6 +77,11 @@
      */
     private Map m_elements = new HashMap();
 
+    /**
+     * XML document parser.
+     */
+    private DocumentBuilder m_builder;
+
     public Element getElem() {
         return m_elem;
     }
@@ -106,16 +121,31 @@
         // @Component
         if (desc.equals("Lorg/apache/felix/ipojo/annotations/Component;")) {
             // It is a component
+            m_elem =  new Element("component", "");
             m_containsAnnotation = true;
             m_elem.addAttribute(new Attribute("className", m_className.replace('/', '.')));
             return new ComponentVisitor();
         }
 
+        // @Handler
+        if (desc.equals("Lorg/apache/felix/ipojo/annotations/Handler;")) {
+            // It is a handler, change the root element
+            m_elem = new Element("handler", "");
+            m_containsAnnotation = true;
+            m_elem.addAttribute(new Attribute("classname", m_className.replace('/', '.')));
+            return new HandlerVisitor();
+        }
+
         // @Provides
         if (desc.equals("Lorg/apache/felix/ipojo/annotations/Provides;")) {
             return new ProvidesVisitor();
         }
 
+        // @HandlerDeclaration
+        if (desc.equals("Lorg/apache/felix/ipojo/annotations/HandlerDeclaration;")) {
+            return new HandlerDeclarationVisitor();
+        }
+
         if (CustomAnnotationVisitor.isCustomAnnotation(desc)) {
             Element elem = CustomAnnotationVisitor.buildElement(desc);
             return new CustomAnnotationVisitor(elem, this, true, true);
@@ -191,6 +221,32 @@
     }
 
     /**
+     * Creates a 'fresh' document builder.
+     * @return a new document builder is not already created, else reset
+     * the created one, and return it.
+     */
+    protected DocumentBuilder getFreshDocumentBuilder() {
+        if (m_builder == null) {
+
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            factory.setNamespaceAware(true);
+            try {
+                m_builder = factory.newDocumentBuilder();
+            } catch (ParserConfigurationException e) {
+                // TODO GSA is this acceptable to throw a RuntimeException here ?
+                e.printStackTrace();
+            }
+
+            return m_builder;
+        }
+
+        // The builder has to be reseted
+        m_builder.reset();
+
+        return m_builder;
+    }
+
+    /**
      * Parse the @provides annotation.
      */
     private class ProvidesVisitor extends EmptyVisitor implements AnnotationVisitor {
@@ -407,4 +463,115 @@
             }
         }
     }
+
+    /**
+     * Parses the @Handler annotation.
+     */
+    private class HandlerVisitor extends EmptyVisitor implements AnnotationVisitor {
+
+        /**
+         * Visit @handler annotation attributes.
+         * @param arg0 : annotation attribute name
+         * @param arg1 : annotation attribute value
+         * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
+         */
+        public void visit(String arg0, Object arg1) {
+            if (arg0.equals("name")) {
+                m_elem.addAttribute(new Attribute("name", arg1.toString()));
+                return;
+            }
+            if (arg0.equals("namespace")) {
+                m_elem.addAttribute(new Attribute("namespace", arg1.toString()));
+                return;
+            }
+            if (arg0.equals("level")) {
+                m_elem.addAttribute(new Attribute("level", arg1.toString()));
+                return;
+            }
+            if (arg0.equals("architecture")) {
+                m_elem.addAttribute(new Attribute("architecture", arg1.toString()));
+                return;
+            }
+        }
+    }
+
+    /**
+     * Parse the @HandlerDeclaration annotation.
+     */
+    private class HandlerDeclarationVisitor extends EmptyVisitor implements AnnotationVisitor {
+
+        /**
+         * XML accepted by the handler.
+         */
+        private String m_value;
+
+        /**
+         * Parses the value attribute.
+         * @param arg0 'value'
+         * @param arg1 the value
+         * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
+         */
+        public void visit(String arg0, Object arg1) {
+            // there is only a 'value' attribute
+            this.m_value = (String) arg1;
+        }
+
+        /**
+         * End of the visit.
+         * Builds the XML document.
+         * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
+         */
+        public void visitEnd() {
+            // The value is an XML document
+            DocumentBuilder builder = getFreshDocumentBuilder();
+            InputStream is = new ByteArrayInputStream(m_value.getBytes());
+            Document document = null;
+            try {
+                document = builder.parse(is);
+                convertDOMElements(m_elem, document.getDocumentElement());
+            } catch (Exception e) {
+                // TODO GSA change this to a logger ?
+                System.err.println("[warning] Cannot convert " + m_value + " to iPOJO Elements.");
+            }
+        }
+
+        /**
+         * Converts recursively the given XML Element into an iPOJO Element.
+         * @param root iPOJO root Element
+         * @param xmlElement DOM Element to be converted
+         */
+        private void convertDOMElements(final Element root,
+                                        final org.w3c.dom.Element xmlElement) {
+
+            // Create an equivalent iPOJO element
+            Element converted = new Element(xmlElement.getLocalName(), xmlElement.getNamespaceURI());
+
+            // Convert attributes if any
+            if (xmlElement.hasAttributes()) {
+                NamedNodeMap attributes = xmlElement.getAttributes();
+                for (int i = 0; i < attributes.getLength(); i++) {
+                    Attr attr = (Attr) attributes.item(i);
+                    converted.addAttribute(new Attribute(attr.getName(),
+                                                         attr.getNamespaceURI(),
+                                                         attr.getValue()));
+                }
+            }
+
+            // Convert child elements if any
+            if (xmlElement.hasChildNodes()) {
+                NodeList childs = xmlElement.getChildNodes();
+                for (int i = 0; i < childs.getLength(); i++) {
+
+                    // Recursive call
+                    convertDOMElements(converted, (org.w3c.dom.Element) childs.item(i));
+                }
+            }
+
+            // Add converted element as a root's child
+            root.addElement(converted);
+        }
+
+
+    }
 }
+
diff --git a/ipojo/tests/integration-tests/pom.xml b/ipojo/tests/integration-tests/pom.xml
index cc564e3..38a79f1 100644
--- a/ipojo/tests/integration-tests/pom.xml
+++ b/ipojo/tests/integration-tests/pom.xml
@@ -24,6 +24,7 @@
             </goals>
             <configuration>
               <hideOutputs>true</hideOutputs>
+              <logService>false</logService>
               <configuration>
               <org.osgi.http.port>8083</org.osgi.http.port>
               </configuration>
@@ -239,12 +240,7 @@
       <scope>test</scope>
     </dependency>
   <!--  Utility bundles -->
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.apache.felix.configadmin</artifactId>
-      <version>1.2.2</version>
-      <scope>test</scope>
-    </dependency>
+   
     <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.apache.felix.ipojo.handler.whiteboard</artifactId>
@@ -287,6 +283,12 @@
       <version>${ipojo.version}</version>
       <scope>test</scope>
     </dependency>
+     <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.configadmin</artifactId>
+      <version>1.2.4</version>
+      <scope>test</scope>
+    </dependency>
     </dependencies>
     </profile>
   </profiles>
