diff --git a/dependencymanager/runtime/LICENSE b/dependencymanager/runtime/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/dependencymanager/runtime/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
diff --git a/dependencymanager/runtime/NOTICE b/dependencymanager/runtime/NOTICE
new file mode 100644
index 0000000..cfc3633
--- /dev/null
+++ b/dependencymanager/runtime/NOTICE
@@ -0,0 +1,26 @@
+Apache Felix Dependency Manager
+Copyright 2009 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2007).
+Licensed under the Apache License 2.0.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2007).
+Licensed under the Apache License 2.0.
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/dependencymanager/runtime/pom.xml b/dependencymanager/runtime/pom.xml
new file mode 100644
index 0000000..1fa08fe
--- /dev/null
+++ b/dependencymanager/runtime/pom.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+  <!--
+    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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.apache.felix</groupId>
+    <artifactId>felix</artifactId>
+    <version>1.0.4</version>
+    <relativePath>../../pom/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>bundle</packaging>
+  <name>Apache Felix Dependency Manager Runtime</name>
+  <version>3.0.0-SNAPSHOT</version>
+  <artifactId>org.apache.felix.dependencymanager.runtime</artifactId>
+
+  <repositories>
+    <repository>
+      <id>maven2-repository.dev.java.net</id>
+      <name>Java.net Maven 2 Repository</name>
+      <url>http://download.java.net/maven/2</url>
+    </repository>
+  </repositories>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>4.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+      <version>4.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
+      <artifactId>org.apache.felix.dependencymanager</artifactId>
+      <version>3.0.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.0</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Bundle-SymbolicName>org.apache.felix.dependencymanager.runtime</Bundle-SymbolicName>
+            <Bundle-Name>Apache Felix Dependency Manager Runtime</Bundle-Name>
+            <Bundle-Description>A bundle that loads components descriptors from started bundles</Bundle-Description>
+            <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
+            <Private-Package>org.apache.felix.dm.runtime.*</Private-Package>
+            <Import-Package>*</Import-Package>
+            <Bundle-Activator>org.apache.felix.dm.runtime.Activator</Bundle-Activator>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <scm>
+    <connection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.dependencymanager-3.0.0</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.dependencymanager-3.0.0</developerConnection>
+    <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.dependencymanager-3.0.0</url>
+  </scm>
+</project>
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/Activator.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/Activator.java
new file mode 100644
index 0000000..56f4eb8
--- /dev/null
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/Activator.java
@@ -0,0 +1,58 @@
+/*
+ * 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.dm.runtime;
+
+import org.apache.felix.dm.DependencyActivatorBase;
+import org.apache.felix.dm.DependencyManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.log.LogService;
+
+/*
+ * This is the Activator for our DependencyManager Component Runtime.
+ * Here, we'll track started/stopped bundles which have some DependencyManager
+ * descriptors (OSGI-INF/*.dm). Such descriptors are generated by the Bnd 
+ * plugin which parses DependencyManager annotations at compile time.
+ */
+public class Activator extends DependencyActivatorBase
+{
+    private ComponentManager _deployer = new ComponentManager();
+
+    @Override
+    public void init(BundleContext context, DependencyManager dm) throws Exception
+    {
+        // If the "dm.log=true" parameter is configured in the OSGi config.properties
+        // then, we'll wait for the LogService, else we'll use an optional dependency over it,
+        // and we'll eventually use a Null LogService Object.
+        // Notice that the Felix log service must also be configured from the OSGi config.properites, using
+        // the "org.apache.felix.log.storeDebug=true" property, in order to display DEBUG log levels.
+
+        boolean logActive = "true".equals(context.getProperty("dm.log"));
+        dm.add(createService()
+               .setImplementation(_deployer)
+               .add(createServiceDependency()
+                   .setService(LogService.class)
+                   .setRequired(logActive)
+                   .setAutoConfig(true)));
+    }
+
+    @Override
+    public void destroy(BundleContext context, DependencyManager dm) throws Exception
+    {
+    }
+}
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ComponentManager.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ComponentManager.java
new file mode 100644
index 0000000..924ef80
--- /dev/null
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ComponentManager.java
@@ -0,0 +1,349 @@
+/*
+ * 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.dm.runtime;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.dependencies.ConfigurationDependency;
+import org.apache.felix.dm.dependencies.Dependency;
+import org.apache.felix.dm.dependencies.ServiceDependency;
+import org.apache.felix.dm.service.Service;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.SynchronousBundleListener;
+import org.osgi.service.log.LogService;
+
+/**
+ * This class parses service descriptors generated by the annotation bnd processor.
+ * The descriptors are located under OSGI-INF/ directory. Such files are actually 
+ * referenced by a specific "DependendencyManager-Component" manifest header.
+ */
+public class ComponentManager implements SynchronousBundleListener
+{
+    private HashMap<Bundle, List<Service>> m_services = new HashMap<Bundle, List<Service>>();
+    private LogService m_logService; // Injected
+    private BundleContext m_bctx; // Injected
+
+    /**
+     * Starts our Service (at this point, we have been injected with our bundle context, as well
+     * as with our log service. We'll listen to bundle start/stop events (we implement the 
+     * SynchronousBundleListener interface).
+     */
+    protected void start()
+    {
+        for (Bundle b : m_bctx.getBundles())
+        {
+            if (b.getState() == Bundle.ACTIVE)
+            {
+                bundleChanged(new BundleEvent(Bundle.ACTIVE, b));
+            }
+        }
+        m_bctx.addBundleListener(this);
+    }
+
+    /**
+     * Stops our service. We'll stop all activated DependencyManager services.
+     */
+    protected void stop()
+    {
+        for (List<Service> services : m_services.values())
+        {
+            for (Service service : services)
+            {
+                service.stop();
+            }
+        }
+        m_services.clear();
+    }
+
+    /**
+     * Handle a bundle event, and eventually parse started bundles.
+     */
+    public void bundleChanged(BundleEvent event)
+    {
+        Bundle b = event.getBundle();
+        if (b.getState() == Bundle.ACTIVE)
+        {
+            bundleStarted(b);
+        }
+        else if (b.getState() == Bundle.STOPPING)
+        {
+            bundleStopped(b);
+        }
+    }
+
+    /**
+     * Checks if a started bundle have some DependencyManager descriptors 
+     * referenced in the "DependencyManager-Component" OSGi header.
+     * @param b the started bundle.
+     */
+    void bundleStarted(Bundle b)
+    {
+        String descriptorPaths = (String) b.getHeaders().get("DependencyManager-Component");
+        if (descriptorPaths == null)
+        {
+            return;
+        }
+
+        for (String descriptorPath : descriptorPaths.split(","))
+        {
+            URL descriptorURL = b.getEntry(descriptorPath);
+            if (descriptorURL == null)
+            {
+                m_logService.log(LogService.LOG_ERROR,
+                    "DependencyManager component descriptor not found: " + descriptorPath);
+                continue;
+            }
+            loadDescriptor(b, descriptorURL);
+        }
+    }
+
+    /**
+     * Load a DependencyManager component descriptor from a given bundle.
+     * @param b
+     * @param descriptorURL
+     */
+    private void loadDescriptor(Bundle b, URL descriptorURL)
+    {
+        m_logService.log(LogService.LOG_DEBUG, "Parsing descriptor " + descriptorURL
+            + " from bundle " + b.getSymbolicName());
+
+        BufferedReader in = null;
+        try
+        {
+            DescriptorParser parser = new DescriptorParser(m_logService);
+            in = new BufferedReader(new InputStreamReader(descriptorURL.openStream()));
+            DependencyManager dm = new DependencyManager(b.getBundleContext());
+            Service service = null;
+            String line;
+
+            while ((line = in.readLine()) != null)
+            {
+                switch (parser.parse(line))
+                {
+                    case Service:
+                        service = createService(b, dm, parser);
+                        break;
+
+                    case ServiceDependency:
+                        checkServiceParsed(service);
+                        service.add(createServiceDependency(b, dm, parser));
+                        break;
+
+                    case ConfigurationDependency:
+                        checkServiceParsed(service);
+                        service.add(createConfigurationDependency(b, dm, parser));
+                        break;
+                }
+            }
+
+            List<Service> services = m_services.get(b);
+            if (services == null)
+            {
+                services = new ArrayList<Service>();
+                m_services.put(b, services);
+            }
+            services.add(service);
+            dm.add(service);
+        }
+        catch (Throwable t)
+        {
+            m_logService.log(LogService.LOG_ERROR, "Error while parsing descriptor " + descriptorURL
+                + " from bundle " + b.getSymbolicName(), t);
+        }
+        finally
+        {
+            if (in != null)
+            {
+                try
+                {
+                    in.close();
+                }
+                catch (IOException ignored)
+                {
+                }
+            }
+        }
+    }
+
+    /**
+     * Unregisters all services for a stopping bundle.
+     * @param b
+     */
+    private void bundleStopped(Bundle b)
+    {
+        m_logService.log(LogService.LOG_INFO, "bundle stopped: " + b.getSymbolicName());
+        List<Service> services = m_services.remove(b);
+        if (services != null)
+        {
+            for (Service s : services)
+            {
+                m_logService.log(LogService.LOG_INFO, "stopping service " + s);
+                s.stop();
+            }
+        }
+    }
+
+    /**
+     * Check if we have already parsed the Service entry from a given DM component descriptor file.
+     * Each descriptor must start with a Service definition entry.
+     * @param service the parsed service
+     * @throws IllegalArgumentException if the service has not been parsed.
+     */
+    private void checkServiceParsed(Service service)
+    {
+        if (service == null)
+        {
+            throw new IllegalArgumentException("Service not declared in the first descriptor line");
+        }
+    }
+
+    /**
+     * Creates a Service that we parsed from a component descriptor entry.
+     * @param b the bundle from where the service is started
+     * @param dm the DependencyManager framework
+     * @param parser the parser that just parsed the descriptor "Service" entry
+     * @return the created DependencyManager Service
+     * @throws ClassNotFoundException if the service implementation could not be instantiated
+     */
+    private Service createService(Bundle b, DependencyManager dm, DescriptorParser parser)
+        throws ClassNotFoundException
+    {
+        Service service = dm.createService();
+        // Set service impl
+        String impl = parser.getString(DescriptorParam.impl);
+        service.setImplementation(b.loadClass(impl));
+
+        // Set service callbacks
+        String init = parser.getString(DescriptorParam.init, null);
+        String start = parser.getString(DescriptorParam.start, null);
+        String stop = parser.getString(DescriptorParam.stop, null);
+        String destroy = parser.getString(DescriptorParam.destroy, null);
+        service.setCallbacks(init, start, stop, destroy);
+
+        // Set service interface with associated service properties
+        Dictionary<String, String> serviceProperties = parser.getDictionary(
+            DescriptorParam.properties, null);
+        String[] provides = parser.getStrings(DescriptorParam.provide, null);
+        if (provides != null)
+        {
+            service.setInterface(provides, serviceProperties);
+        }
+
+        // Set Composition
+        String composition = parser.getString(DescriptorParam.composition, null);
+        if (composition != null)
+        {
+            service.setComposition(composition);
+        }
+
+        // Set service factory
+        String factory = parser.getString(DescriptorParam.factory, null);
+        String factoryMethod = parser.getString(DescriptorParam.factoryMethod, null);
+
+        if (factory != null)
+        {
+            if (factoryMethod == null)
+            {
+                factoryMethod = "create";
+            }
+            Class<?> factoryClass = b.loadClass(factory);
+            service.setFactory(factoryClass, factoryMethod);
+        }
+        else if (factoryMethod != null)
+        {
+            service.setFactory(factoryMethod);
+        }
+        return service;
+    }
+
+    /**
+     * Creates a ServiceDependency that we parsed from a component descriptor "ServiceDependency" entry.
+     * @param b
+     * @param dm
+     * @param parser
+     * @return
+     * @throws ClassNotFoundException
+     */
+    private ServiceDependency createServiceDependency(Bundle b, DependencyManager dm,
+        DescriptorParser parser) throws ClassNotFoundException
+    {
+        ServiceDependency sd = dm.createServiceDependency();
+
+        // Set service with eventual service filter
+        String service = parser.getString(DescriptorParam.service);
+        Class serviceClass = b.loadClass(service);
+        String serviceFilter = parser.getString(DescriptorParam.filter, null);
+        sd.setService(serviceClass, serviceFilter);
+
+        // Set default service impl
+        String defaultServiceImpl = parser.getString(DescriptorParam.defaultImpl, null);
+        if (defaultServiceImpl != null)
+        {
+            Class defaultServiceImplClass = b.loadClass(defaultServiceImpl);
+            sd.setDefaultImplementation(defaultServiceImplClass);
+        }
+
+        // Set required flag
+        String required = parser.getString(DescriptorParam.required, "true");
+        sd.setRequired("true".equals(required));
+
+        // Set bind/unbind/rebind
+        String added = parser.getString(DescriptorParam.added, null);
+        String changed = parser.getString(DescriptorParam.changed, null);
+        String removed = parser.getString(DescriptorParam.removed, null);
+        sd.setCallbacks(added, changed, removed);
+
+        // Set AutoConfig
+        String autoConfigField = parser.getString(DescriptorParam.autoConfig, null);
+        if (autoConfigField != null)
+        {
+            sd.setAutoConfig(autoConfigField);
+        }
+        return sd;
+    }
+
+    /**
+     * Creates a ConfigurationDependency that we parsed from a component descriptor entry.
+     * @param b
+     * @param dm
+     * @param parser
+     * @return
+     */
+    private Dependency createConfigurationDependency(Bundle b, DependencyManager dm,
+        DescriptorParser parser)
+    {
+        ConfigurationDependency cd = dm.createConfigurationDependency();
+        String pid = parser.getString(DescriptorParam.pid);
+        String propagate = parser.getString(DescriptorParam.propagate, "false");
+        cd.setPropagate("true".equals(propagate));
+        String callback = parser.getString(DescriptorParam.updated, "updated");
+        cd.setCallback(callback);
+        return cd;
+    }
+}
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorEntry.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorEntry.java
new file mode 100644
index 0000000..226799f
--- /dev/null
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorEntry.java
@@ -0,0 +1,30 @@
+/*
+ * 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.dm.runtime;
+
+/**
+ * Type of each DependendencyManager component descriptor entry.
+ * @see DescriptorParser for more informations about the descriptor syntax.
+ */
+public enum DescriptorEntry
+{
+    Service,
+    ServiceDependency,
+    ConfigurationDependency
+}
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorParam.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorParam.java
new file mode 100644
index 0000000..9ba1af2
--- /dev/null
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorParam.java
@@ -0,0 +1,133 @@
+/*
+ * 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.dm.runtime;
+
+import java.util.EnumSet;
+
+/**
+ * List of all valid attribute a DependencyManager component descriptor may contain.
+ * @see DescriptorParser for the descriptor syntax.
+ */
+public enum DescriptorParam
+{
+    /* Service attribute for the init method (the parsed value is a String) */
+    init,
+
+    /* Service attribute for the start method (the parsed value is a String) */
+    start,
+
+    /* Stop attribute for the stop method (the parsed value is a String) */
+    stop,
+
+    /* Service attribute for the destroy method (the parsed value is a String) */
+    destroy,
+
+    /* Service attribute for the impl service class name (the parsed value is a String) */
+    impl,
+
+    /* Service attribute for the provided services class names (the parsed value is a String[]) */
+    provide,
+
+    /* Service attribute for the provided service properties (the parsed value is a Hashtable) */
+    properties,
+
+    /* Service attribute for the factory class name (the parsed value is a String) */
+    factory,
+
+    /* Service attribute for the factory method name (the parsed value is a String) */
+    factoryMethod,
+
+    /* Service attribute for the composition method name (the parsed value is a String) */
+    composition,
+
+    /* ServiceDependency attribute for the interface we depend on (the parsed value is a String) */
+    service,
+
+    /* ServiceDependency attribute for the service filter (the parsed value is a String) */
+    filter,
+
+    /* ServiceDependency attribute for the service default impl (the parsed value is a String) */
+    defaultImpl,
+
+    /* ServiceDependency attribute for the required booleean (the parsed value is a String ("false"|"true") */
+    required,
+
+    /* ServiceDependency attribute for the added callback name (the parsed value is a String) */
+    added,
+
+    /* ServiceDependency attribute for the added changed name (the parsed value is a String) */
+    changed,
+
+    /* ServiceDependency attribute for the added removed name (the parsed value is a String) */
+    removed,
+
+    /* ServiceDependency attribute for the auto config field name (the parsed value is a String) */
+    autoConfig,
+
+    /* ConfigurationDependency attribute for the PID (the parsed value is a String) */
+    pid,
+
+    /* ConfigurationDependency attribute for the propagate boolean (the parsed value is a String ("false"|"true") */
+    propagate,
+
+    /* ConfigurationDependency attribute for the updated callback method (the parsed value is a String */
+    updated;
+    
+    /**
+     * Indicates if a given attribute is a Service attribute.
+     * @param attr a Descriptor attribute
+     * @return true if the descriptor is a Service attribute, false if not
+     */
+    public static boolean isServiceAttribute(DescriptorParam attr) {
+        return serviceAttribute.contains(attr);
+    }
+    
+    /**
+     * Indicates if a given attribute is a ServiceDependency attribute.
+     * @param attr a Descriptor attribute
+     * @return true if the descriptor is a Service attribute, false if not
+     */
+    public static boolean isServiceDepependencyAttribute(DescriptorParam attr) {
+        return serviceDependencyAttribute.contains(attr);
+    }
+
+    /**
+     * Indicates if a given attribute is a ServiceDependency attribute.
+     * @param attr a Descriptor attribute
+     * @return true if the descriptor is a Service attribute, false if not
+     */
+    public static boolean isConfigurationDepependencyAttribute(DescriptorParam attr) {
+        return configurationDependencyAttribute.contains(attr);
+    }
+
+    /**
+     * List of Service attributes
+     */
+    private final static EnumSet serviceAttribute = EnumSet.range(init, factoryMethod);
+
+    /**
+     * List of ServiceDependency attributes
+     */
+    private final static EnumSet serviceDependencyAttribute = EnumSet.range(service, autoConfig);
+
+    /**
+     * List of ConfigurationDependency attributes
+     */
+    private final static EnumSet configurationDependencyAttribute = EnumSet.range(pid, updated);
+}
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorParser.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorParser.java
new file mode 100644
index 0000000..cfb9e68
--- /dev/null
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/DescriptorParser.java
@@ -0,0 +1,270 @@
+/*
+ * 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.dm.runtime;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.osgi.service.log.LogService;
+
+/**
+ * This class parses files generated in OSGI-INF/*.dm by the DependencyManager bnd plugin.
+ * Each descriptor contains the definition of a Service, along with its corresponding service dependency or configuration dependencies.
+ * Here is an example of a typical descriptor syntax:
+ *   
+ *    Service: start=start; stop=stop; impl=org.apache.felix.dm.test.annotation.ServiceConsumer; 
+ *    ServiceDependency: service=org.apache.felix.dm.test.annotation.ServiceInterface; autoConfig=m_service; 
+ *    ServiceDependency: added=bind; service=org.apache.felix.dm.test.annotation.ServiceInterface; 
+ * 
+ * Notice that the descriptor must start with a "Service" definition. (Dependencies must be declared after the "Service" entry).
+ * <p>
+ * 
+ * Now, here is the formal BNF definition of the descriptor syntax:
+ *
+ *    line := <type> ':' <params>
+ *    
+ *    type := service|serviceDependency|configurationDependency
+ *    service := 'Service'
+ *    serviceDependency := 'ServiceDependency'
+ *    configurationDependency := 'ConfigurationDependency'
+ *    
+ *    params := paramName '=' paramValue ( ';' paramName '=' paramValue )*
+ *    
+ *    paramName := init | start | stop | destroy | impl | provide | properties | factory | factoryMethod | composition | service | filter | 
+ *                 defaultImpl | required | added | changed | removed | autoConfig | pid | propagate | updated
+ *    init := 'init'
+ *    start := 'start'
+ *    stop := 'stop'
+ *    destroy := 'destroy'
+ *    impl := 'impl'
+ *    provide := 'provide'
+ *    properties := 'properties'
+ *    factory := 'factory'
+ *    factoryMethod := 'factoryMethod'
+ *    composition := 'composition'
+ *    service := 'service'
+ *    filter := 'filter'
+ *    defaultImpl := 'defaultImpl'
+ *    required := 'required'
+ *    added := 'added'
+ *    changed := 'changed'
+ *    removed := 'removed'
+ *    autoConfig := 'autoConfig'
+ *    pid := 'pid'
+ *    propagate := 'propagate'
+ *    updated := 'updated'
+ *    
+ *    paramValue := strings | attributes
+ *    strings := string ( ',' string )*
+ *    attributes := string ':' string ( ',' string : string )*
+ *    string := [alphanum string]
+ * 
+ * </pre>
+ * </blockquote>
+ */
+public class DescriptorParser
+{
+    private LogService m_logService;
+    private Map<DescriptorParam, Object> m_params = new HashMap<DescriptorParam, Object>();
+
+    private final static Pattern linePattern = Pattern.compile("(\\w+):\\s*(.*)", Pattern.COMMENTS);
+    private final static Pattern paramPattern = Pattern.compile("([^=]+)=([^;]+);?");
+    private final static Pattern stringsPattern = Pattern.compile("([^,]+)");
+    private final static Pattern attributesPattern = Pattern.compile("([^:]+):([^,]+),?");
+
+    public DescriptorParser(LogService service)
+    {
+        m_logService = service;
+    }
+
+    /*
+     * Parses a DependencyManager component descriptor entry (either a Service, a ServiceDependency, or a ConfigurationDependency entry).
+     * @return DescriptorEntry.Service, DescriptorEntry.ServiceDependency, or DescriptorEntry.ConfigurationDependency 
+     */
+    public DescriptorEntry parse(String line)
+    {
+        m_params.clear();
+        Matcher lineMatcher = linePattern.matcher(line);
+        if (lineMatcher.matches())
+        {
+            DescriptorEntry entry = DescriptorEntry.valueOf(lineMatcher.group(1).trim());
+            Matcher paramMatcher = paramPattern.matcher(lineMatcher.group(2).trim());
+            while (paramMatcher.find())
+            {
+                DescriptorParam paramName = DescriptorParam.valueOf(paramMatcher.group(1).trim());
+                String paramValue = paramMatcher.group(2).trim();
+                Matcher attributesMatcher = attributesPattern.matcher(paramValue);
+                boolean matched = false;
+
+                Hashtable<String, String> attributes = new Hashtable<String, String>();
+                while (attributesMatcher.find())
+                {
+                    matched = true;
+                    attributes.put(attributesMatcher.group(1).trim(),
+                        attributesMatcher.group(2).trim());
+                }
+                m_params.put(paramName, attributes);
+
+                if (!matched)
+                {
+                    Matcher stringsMatcher = stringsPattern.matcher(paramValue);
+                    if (stringsMatcher.groupCount() > 0)
+                    {
+                        List<String> strings = new ArrayList<String>();
+                        while (stringsMatcher.find())
+                        {
+                            strings.add(stringsMatcher.group(1).trim());
+                        }
+                        m_params.put(paramName, strings.toArray(new String[strings.size()]));
+                    }
+                }
+            }
+            
+            m_logService.log(LogService.LOG_DEBUG, "Parsed " + entry + ": " + toString());
+            return entry;
+        }
+        else
+        {
+            throw new IllegalArgumentException("Invalid descriptor entry: " + line);
+        }
+    }
+
+    /**
+     * Once a component descriptor entry line is parsed, you can retrieve entry attributes using this method.
+     * @param param
+     * @return
+     */
+    public String getString(DescriptorParam param)
+    {
+        Object value = m_params.get(param);
+        if (value == null)
+        {
+            throw new IllegalArgumentException("Parameter " + param + " not found");
+        }
+        if (!(value instanceof String[]))
+        {
+            throw new IllegalArgumentException("Parameter " + param + " not a String array");
+        }
+        String[] array = (String[]) value;
+        if (array.length < 1)
+        {
+            throw new IllegalArgumentException("Parameter " + param + " not found");
+        }
+        return (array[0]);
+    }
+
+    /**
+     * Once a component descriptor entry line is parsed, you can retrieve entry attributes using this method.
+     *
+     * @param param
+     * @param def
+     * @return
+     */
+    public String getString(DescriptorParam param, String def)
+    {
+        try
+        {
+            return getString(param);
+        }
+        catch (IllegalArgumentException e)
+        {
+            return def;
+        }
+    }
+    
+    /**
+     * Once a component descriptor entry line is parsed, you can retrieve entry attributes using this method.
+     * @param param
+     * @return
+     */
+    public String[] getStrings(DescriptorParam param) {
+        Object value = m_params.get(param);
+        if (value == null)
+        {
+            throw new IllegalArgumentException("Parameter " + param + " not found");
+        }
+        if (!(value instanceof String[]))
+        {
+            throw new IllegalArgumentException("Parameter " + param + " not a String array");
+        }
+        return (String[]) value;
+    }
+
+    /**
+     * Once a component descriptor entry line is parsed, you can retrieve entry attributes using this method.
+     * @param param
+     * @return
+     */
+    public String[] getStrings(DescriptorParam param, String[] def)
+    {
+        try
+        {
+            return getStrings(param);
+        }
+        catch (IllegalArgumentException e)
+        {
+            return def;
+        }
+    }
+    
+    /**
+     * Once a component descriptor entry line is parsed, you can retrieve entry attributes using this method.
+     * @param param
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public Dictionary<String, String> getDictionary(DescriptorParam param, Dictionary<String, String> def) {
+        Object value = m_params.get(param);
+        if (value == null)
+        {
+            return def;
+        }
+        if (!(value instanceof Dictionary))
+        {
+            throw new IllegalArgumentException("Parameter " + param + " not Dictionary");
+        }
+        return (Dictionary<String, String>) value;
+    }
+    
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<DescriptorParam, Object> entry : m_params.entrySet()) {
+            sb.append(entry.getKey());
+            sb.append("=");
+            Object val = entry.getValue();
+            if (val instanceof String || val instanceof Dictionary<?, ?>) {
+                sb.append(val.toString());
+            } else if (val instanceof String[]) {
+                sb.append(Arrays.toString((String[]) val));
+            } else {
+                sb.append(val.toString());
+            }
+            sb.append(";");
+        }
+        return sb.toString();
+    }
+}
