diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherHandler.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherHandler.java
index 2338be7..d89f6f1 100644
--- a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherHandler.java
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherHandler.java
@@ -29,6 +29,7 @@
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.PrimitiveHandler;
 import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.architecture.PropertyDescription;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.parser.FieldMetadata;
@@ -72,6 +73,11 @@
     private Map m_publishersByField = new Hashtable();
 
     /**
+     * The handler description
+     */
+    private EventAdminPublisherHandlerDescription m_description;
+
+    /**
      * Initializes the component type.
      *
      * @param cd the component type description to populate
@@ -80,7 +86,6 @@
      * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription,
      *      org.apache.felix.ipojo.metadata.Element)
      */
-    // @Override
     public void initializeComponentFactory(ComponentTypeDescription cd,
             Element metadata)
         throws ConfigurationException {
@@ -96,7 +101,7 @@
 
         // if publisher is null, look for 'publishes' elements
         if (publishers == null  || publishers.length == 0) {
-        	publishers = metadata.getElements("publishes", NAMESPACE);
+            publishers = metadata.getElements("publishes", NAMESPACE);
         }
 
         if (publishers != null) {
@@ -152,7 +157,6 @@
      * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager,
      *      org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
      */
-    // @Override
     public void configure(Element metadata, Dictionary conf)
         throws ConfigurationException {
 
@@ -167,7 +171,7 @@
 
         // if publisher is null, look for 'publishes' elements
         if (publishers == null  || publishers.length == 0) {
-        	publishers = metadata.getElements("publishes", NAMESPACE);
+            publishers = metadata.getElements("publishes", NAMESPACE);
         }
 
         if (publishers != null) {
@@ -208,10 +212,17 @@
                         .getField(publisherMetadata.getField(),
                                 Publisher.class.getName());
                 m_manager.register(fieldMetadata, this);
+
             }
         } else {
             info(LOG_PREFIX + "No publisher to configure");
         }
+
+        setValidity(true);
+
+        debug(LOG_PREFIX+ "Setup description....");
+        m_description = new EventAdminPublisherHandlerDescription(this, m_publishersByField.values()); // Initialize the description.
+
     }
 
     /**
@@ -219,7 +230,6 @@
      *
      * This method does nothing.
      */
-    // @Override
     public void start() {
     }
 
@@ -228,7 +238,6 @@
      *
      * This method does nothing.
      */
-    // @Override
     public void stop() {
     }
 
@@ -242,7 +251,6 @@
      *
      * @return the Publisher associated with the accessed field's name
      */
-    // @Override
     public Object onGet(Object pojo, String fieldName, Object value) {
         // Retrieve the publisher associated to the given field name
         Publisher pub = (Publisher) m_publishersByField.get(fieldName);
@@ -262,4 +270,14 @@
     public EventAdmin getEventAdminService() {
         return m_ea;
     }
+
+    /**
+     * Gets the handler description
+     * @see org.apache.felix.ipojo.Handler#getDescription()
+     */
+    public HandlerDescription getDescription() {
+        return m_description;
+    }
+
+
 }
diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherHandlerDescription.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherHandlerDescription.java
new file mode 100644
index 0000000..3069766
--- /dev/null
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherHandlerDescription.java
@@ -0,0 +1,102 @@
+/*
+ * 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.handlers.event.publisher;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+
+/**
+ * Handler Description for Event Admin Publisher.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class EventAdminPublisherHandlerDescription extends HandlerDescription {
+
+    /**
+     * The list of publishers.
+     */
+    List/*<PublisherDescription>*/ m_publishersDescriptions;
+
+    // FIXME : Add listener interface for
+    //       : onServiceArrival, onServiceDeparture, onServiceBound, onServiceUnbound
+    //       : methods.
+
+    /**
+     * Creates the {@link EventAdminPublisherHandlerDescription}.
+     * @param handler the handler
+     * @param publishers the list of publishers
+     */
+    public EventAdminPublisherHandlerDescription(Handler handler, Collection/*<Publisher>*/ publishers) {
+        super(handler);
+
+        m_publishersDescriptions = new ArrayList/*<PublisherDescription>*/();
+        if (publishers != null) {
+            Iterator iterator = publishers.iterator();
+            while (iterator.hasNext()){
+                Publisher p = (Publisher) iterator.next();
+                m_publishersDescriptions.add(new PublisherDescription(p));
+            }
+        }
+
+    }
+
+    /**
+     * Gets the publisher descriptions.
+     * @return the descriptions.
+     */
+    public PublisherDescription[] getPublisherDescriptions() {
+        return (PublisherDescription[])
+            m_publishersDescriptions.toArray(new PublisherDescription[m_publishersDescriptions.size()]);
+    }
+
+    /**
+     * Gets the handler description.
+     * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+     */
+    public Element getHandlerInfo() {
+        Element root = super.getHandlerInfo();
+        for (int i = 0; i < m_publishersDescriptions.size(); i++) {
+            PublisherDescription p = (PublisherDescription) m_publishersDescriptions.get(i);
+            Element publisher = new Element("Publisher", "");
+            publisher.addAttribute(new Attribute("name", p.getName()));
+            publisher.addAttribute(new Attribute("synchronous", String.valueOf(p.isSynchronous())));
+            publisher.addAttribute(new Attribute("data_key", p.getDataKey()));
+            Element topics = new Element("Topics", "");
+            if (p.getTopics() != null) {
+                for (int j = 0; j < p.getTopics().length; j++) {
+                    String topic = p.getTopics()[j];
+                    Element e_topic = new Element("topic","");
+                    topics.addElement(e_topic);
+                    e_topic.addAttribute(new Attribute("name",topic));
+                }
+            }
+            publisher.addElement(topics);
+            root.addElement(publisher);
+        }
+        return root;
+    }
+
+}
diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherMetadata.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherMetadata.java
index 1c210ea..224117e 100644
--- a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherMetadata.java
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/EventAdminPublisherMetadata.java
@@ -151,11 +151,11 @@
         if (publisher.containsAttribute(DATA_KEY_ATTRIBUTE)) {
             m_dataKey = publisher.getAttribute(DATA_KEY_ATTRIBUTE);
         } else if (publisher.containsAttribute("data_key")) {
-        	// XML Case
+            // XML Case
             m_dataKey = publisher.getAttribute("data_key");
         } else if (publisher.containsAttribute("dataKey")) {
-        	// Annotation case.
-        	m_dataKey = publisher.getAttribute("dataKey");
+            // Annotation case.
+            m_dataKey = publisher.getAttribute("dataKey");
         } else {
             m_dataKey = DEFAULT_DATA_KEY_VALUE;
         }
diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/Publisher.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/Publisher.java
index 8c79e5c..7b25196 100644
--- a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/Publisher.java
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/Publisher.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
@@ -24,22 +24,47 @@
  * An Publisher is the interface between the EventAdminPublisherHandler and a
  * component instance. The POJO can send event through the handler by calling a
  * {@code send} method.
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public interface Publisher {
 
     /**
      * Sends an event with the specified content.
-     * 
+     *
      * @param content the content of the event
      */
     void send(Dictionary content);
 
     /**
      * Sends a data event.
-     * 
+     *
      * @param o the data to send
      */
     void sendData(Object o);
+
+    /**
+     * Gets the published topics.
+     * @return the list of topics.
+     */
+    String[] getTopics();
+
+    /**
+     * Checks is the publisher send data synchronously.
+     * @return <code>true</code> if the publisher is synchronous.
+     */
+    boolean isSynchronous();
+
+    /**
+     * Gets the data key if used.
+     * @return the data key or <code>null</code>
+     */
+    String  getDataKey();
+
+    /**
+     * Gets the publisher name if any.
+     * @return the publisher name
+     */
+    String  getName();
+
 }
diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/PublisherDescription.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/PublisherDescription.java
new file mode 100644
index 0000000..c25f37b
--- /dev/null
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/PublisherDescription.java
@@ -0,0 +1,76 @@
+/*
+ * 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.handlers.event.publisher;
+
+/**
+ * Publisher Description.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class PublisherDescription {
+
+    /**
+     * The described publisher
+     */
+    private Publisher m_publisher;
+
+    /**
+     * Creates a {@link PublisherDescription} based
+     * on the given {@link Publisher}
+     * @param p the publisher
+     */
+    public PublisherDescription(Publisher p) {
+        m_publisher = p;
+    }
+
+
+    /**
+     * Gets the topic list.
+     * @return the list of published topics
+     */
+    public String[] getTopics() {
+        return m_publisher.getTopics();
+    }
+
+    /**
+     * Checks if the publisher is synchronous.
+     * @return <code>true</code> if the publisher is synchronous
+     */
+    public boolean isSynchronous() {
+        return m_publisher.isSynchronous();
+    }
+
+    /**
+     * Gets the data key if used.
+     * @return the data key
+     */
+    public String getDataKey() {
+        return m_publisher.getDataKey();
+    }
+
+    /**
+     * Gets the publisher name if any.
+     * @return the publisher name
+     */
+    public String getName() {
+        return m_publisher.getName();
+    }
+
+
+}
diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/PublisherImpl.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/PublisherImpl.java
index 8a2d6c5..1cdcc89 100644
--- a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/PublisherImpl.java
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/publisher/PublisherImpl.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
@@ -26,7 +26,7 @@
 /**
  * The PublisherImpl class is the implementation of the Publisher object used by
  * components to send events.
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class PublisherImpl implements Publisher {
@@ -63,7 +63,7 @@
 
     /**
      * Constructs an Publisher with given parameters.
-     * 
+     *
      * @param handler the handler that will manage this publisher
      * @param topics the topics on which events are sent
      * @param synchronous the sending mode of events
@@ -84,7 +84,7 @@
 
     /**
      * Sends an event with the specified content.
-     * 
+     *
      * @param content the content of the event
      */
     public void send(Dictionary content) {
@@ -105,7 +105,7 @@
 
     /**
      * Sends a data event.
-     * 
+     *
      * @param object the data to send
      */
     public void sendData(Object object) {
@@ -114,4 +114,32 @@
         content.put(m_dataKey, object);
         send(content);
     }
+
+    /**
+     * @see org.apache.felix.ipojo.handlers.event.publisher.Publisher#getTopics()
+     */
+    public String[] getTopics() {
+        return m_topics;
+    }
+
+    /**
+     * @see org.apache.felix.ipojo.handlers.event.publisher.Publisher#isSynchronous()
+     */
+    public boolean isSynchronous() {
+        return m_synchronous;
+    }
+
+    /**
+     * @see org.apache.felix.ipojo.handlers.event.publisher.Publisher#getDataKey()
+     */
+    public String getDataKey() {
+        return m_dataKey;
+    }
+
+    /**
+     * @see org.apache.felix.ipojo.handlers.event.publisher.Publisher#getName()
+     */
+    public String getName() {
+        return m_instanceName;
+    }
 }
diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/subscriber/EventAdminSubscriberHandler.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/subscriber/EventAdminSubscriberHandler.java
index 3ce2eb5..86748b4 100644
--- a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/subscriber/EventAdminSubscriberHandler.java
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/subscriber/EventAdminSubscriberHandler.java
@@ -34,6 +34,7 @@
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.PrimitiveHandler;
 import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.architecture.PropertyDescription;
 import org.apache.felix.ipojo.handlers.event.EventUtil;
 import org.apache.felix.ipojo.metadata.Element;
@@ -101,6 +102,11 @@
     private boolean m_isListening;
 
     /**
+     * The handler description
+     */
+    private EventAdminSubscriberHandlerDescription m_description;
+
+    /**
      * Initializes the component type.
      *
      * @param cd component type description to populate.
@@ -109,7 +115,6 @@
      * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription,
      *      org.apache.felix.ipojo.metadata.Element)
      */
-    // @Override
     public void initializeComponentFactory(ComponentTypeDescription cd,
             Element metadata)
         throws ConfigurationException {
@@ -177,6 +182,10 @@
                 }
                 nameSet.add(name);
             }
+
+            m_description = new EventAdminSubscriberHandlerDescription(this,
+                    subscribers);
+
         } else {
             info(LOG_PREFIX + "No subscriber to check");
         }
@@ -191,7 +200,6 @@
      * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager,
      *      org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
      */
-    // @Override
     public void configure(Element metadata, Dictionary conf)
         throws ConfigurationException {
 
@@ -278,7 +286,6 @@
      *
      * @see org.apache.felix.ipojo.Handler#start()
      */
-    // @Override
     public synchronized void start() {
         m_isListening = true;
     }
@@ -288,11 +295,17 @@
      *
      * @see org.apache.felix.ipojo.Handler#stop()
      */
-    // @Override
     public synchronized void stop() {
         m_isListening = false;
     }
 
+    /**
+     * @see org.apache.felix.ipojo.Handler#getDescription()
+     */
+    public HandlerDescription getDescription() {
+        return m_description;
+    }
+
     /***************************************************************************
      * OSGi EventHandler callback
      **************************************************************************/
@@ -304,7 +317,7 @@
      * @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event)
      */
     public void handleEvent(final Event event) {
-    	EventAdminSubscriberMetadata subscriberMetadata = null;
+        EventAdminSubscriberMetadata subscriberMetadata = null;
         // Retrieve the event's topic
         String topic = event.getTopic();
 
@@ -320,8 +333,8 @@
             Callback callback = null;
 
             synchronized (this) {
-            	isListening = m_isListening;
-			}
+                isListening = m_isListening;
+            }
 
             // Check if the subscriber's topic and filter match
             Filter filter = subscriberMetadata.getFilter();
@@ -335,7 +348,7 @@
                 try {
                     // Depending on the subscriber type...
                     callbackParam = getCallbackParameter(event,
-							subscriberMetadata);
+                            subscriberMetadata);
                 } catch (ClassCastException e) {
                     // Ignore the data event if type doesn't match
                     warn(LOG_PREFIX + "Ignoring data event : Bad data type", e);
@@ -351,65 +364,65 @@
             // NullPointerExceptions)
             if (isListening  && callback != null  && callbackParam != null) {
                 try {
-					callback.call(new Object[] { callbackParam });
-				} catch (InvocationTargetException e) {
-					error(LOG_PREFIX
+                    callback.call(new Object[] { callbackParam });
+                } catch (InvocationTargetException e) {
+                    error(LOG_PREFIX
                             + "The callback has thrown an exception",
                             e.getTargetException());
-				} catch (Exception e) {
-					error(LOG_PREFIX
+                } catch (Exception e) {
+                    error(LOG_PREFIX
                             + "Unexpected exception when calling callback",
                             e);
-				}
+                }
             }
 
         }
     }
 
-	/**
-	 * Computes the callback parameter.
-	 * @param event the event
-	 * @param subscriberMetadata the subscribe metadata
-	 * @param dataKey the data key
-	 * @return the parameter of the callback
-	 * @throws ClassCastException the data class does not match the found value.
-	 * @throws NoSuchFieldException the datakey is not present in the event.
-	 */
-	private Object getCallbackParameter(final Event event,
-			final EventAdminSubscriberMetadata subscriberMetadata
-			) throws ClassCastException,NoSuchFieldException {
-		String dataKey = subscriberMetadata.getDataKey();
-		if (dataKey == null) {
-		    // Generic event subscriber : pass the event to the
-		    // registered callback
-		    return event;
-		} else {
-		    // Check for a data key in the event
-		    boolean dataKeyPresent = false;
-		    String[] properties = event.getPropertyNames();
-		    for (int j = 0; j < properties.length && !dataKeyPresent; j++) {
-		        if (dataKey.equals(properties[j])) {
-		            dataKeyPresent = true;
-		        }
-		    }
+    /**
+     * Computes the callback parameter.
+     * @param event the event
+     * @param subscriberMetadata the subscribe metadata
+     * @param dataKey the data key
+     * @return the parameter of the callback
+     * @throws ClassCastException the data class does not match the found value.
+     * @throws NoSuchFieldException the datakey is not present in the event.
+     */
+    private Object getCallbackParameter(final Event event,
+            final EventAdminSubscriberMetadata subscriberMetadata
+            ) throws ClassCastException,NoSuchFieldException {
+        String dataKey = subscriberMetadata.getDataKey();
+        if (dataKey == null) {
+            // Generic event subscriber : pass the event to the
+            // registered callback
+            return event;
+        } else {
+            // Check for a data key in the event
+            boolean dataKeyPresent = false;
+            String[] properties = event.getPropertyNames();
+            for (int j = 0; j < properties.length && !dataKeyPresent; j++) {
+                if (dataKey.equals(properties[j])) {
+                    dataKeyPresent = true;
+                }
+            }
 
-		    if (dataKeyPresent) {
-		        // Data event : check type compatibility and
-		        // pass the given object to the registered
-		        // callback
-		        Object data = event.getProperty(dataKey);
-		        Class dataType = subscriberMetadata.getDataType();
-		        Class dataClazz = data.getClass();
-		        if (dataType.isAssignableFrom(dataClazz)) {
-		            return data;
-		        } else {
-		            throw new ClassCastException("Cannot convert " + dataClazz.getName() + " to "
-		                            + dataType.getName());
-		        }
-		    } else {
-		        throw new java.lang.NoSuchFieldException(dataKey);
-		    }
+            if (dataKeyPresent) {
+                // Data event : check type compatibility and
+                // pass the given object to the registered
+                // callback
+                Object data = event.getProperty(dataKey);
+                Class dataType = subscriberMetadata.getDataType();
+                Class dataClazz = data.getClass();
+                if (dataType.isAssignableFrom(dataClazz)) {
+                    return data;
+                } else {
+                    throw new ClassCastException("Cannot convert " + dataClazz.getName() + " to "
+                                    + dataType.getName());
+                }
+            } else {
+                throw new java.lang.NoSuchFieldException(dataKey);
+            }
 
-		}
-	}
+        }
+    }
 }
diff --git a/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/subscriber/EventAdminSubscriberHandlerDescription.java b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/subscriber/EventAdminSubscriberHandlerDescription.java
new file mode 100644
index 0000000..1f9e41f
--- /dev/null
+++ b/ipojo/handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/subscriber/EventAdminSubscriberHandlerDescription.java
@@ -0,0 +1,61 @@
+/*
+ * 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.handlers.event.subscriber;
+
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Element;
+
+/**
+ * Event Admin Subscriber Handler Description.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class EventAdminSubscriberHandlerDescription extends HandlerDescription {
+
+    /**
+     * List of subscribers.
+     */
+    private Element[] m_subscribersDescriptions;
+
+    /**
+     * Creates a {@link EventAdminSubscriberHandlerDescription}
+     * @param handler the handler
+     * @param subscribers the subscribers
+     */
+    public EventAdminSubscriberHandlerDescription(Handler handler, Element[] subscribers) {
+        super(handler);
+         m_subscribersDescriptions = subscribers;
+    }
+
+    /**
+     * Gets the handler info.
+     * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+     */
+    public Element getHandlerInfo() {
+        Element root = super.getHandlerInfo();
+        if (m_subscribersDescriptions != null) {
+            for (int i = 0; i < m_subscribersDescriptions.length; i++) {
+                Element description = m_subscribersDescriptions[i];
+                root.addElement(description);
+            }
+        }
+        return root;
+    }
+}
