diff --git a/scrplugin/ds-annotations/.classpath b/scrplugin/ds-annotations/.classpath
new file mode 100644
index 0000000..30daf94
--- /dev/null
+++ b/scrplugin/ds-annotations/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/scrplugin/ds-annotations/.project b/scrplugin/ds-annotations/.project
new file mode 100644
index 0000000..afadbf1
--- /dev/null
+++ b/scrplugin/ds-annotations/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.felix.scr.spec-annotations</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/scrplugin/ds-annotations/.settings/org.eclipse.core.resources.prefs b/scrplugin/ds-annotations/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..d3c1df2
--- /dev/null
+++ b/scrplugin/ds-annotations/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//src/main/resources=UTF-8
diff --git a/scrplugin/ds-annotations/.settings/org.eclipse.jdt.core.prefs b/scrplugin/ds-annotations/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..abec6ca
--- /dev/null
+++ b/scrplugin/ds-annotations/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/scrplugin/ds-annotations/.settings/org.eclipse.m2e.core.prefs b/scrplugin/ds-annotations/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/scrplugin/ds-annotations/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/scrplugin/ds-annotations/DEPENDENCIES b/scrplugin/ds-annotations/DEPENDENCIES
new file mode 100644
index 0000000..a58a9e8
--- /dev/null
+++ b/scrplugin/ds-annotations/DEPENDENCIES
@@ -0,0 +1,20 @@
+Apache Felix SCR DS Annotations
+Copyright 2012 The Apache Software Foundation
+
+This software was developed at the Apache Software Foundation
+(http://www.apache.org) and may have dependencies on other
+Apache software licensed under Apache License 2.0.
+
+I. Included Third-Party Software
+
+
+II. Used Third-Party Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2012).
+Licensed under the Apache License 2.0. 
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/scrplugin/ds-annotations/LICENSE b/scrplugin/ds-annotations/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/scrplugin/ds-annotations/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/scrplugin/ds-annotations/NOTICE b/scrplugin/ds-annotations/NOTICE
new file mode 100644
index 0000000..bed91c8
--- /dev/null
+++ b/scrplugin/ds-annotations/NOTICE
@@ -0,0 +1,6 @@
+Apache Felix SCR DS Annotations
+Copyright 2012 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
diff --git a/scrplugin/ds-annotations/pom.xml b/scrplugin/ds-annotations/pom.xml
new file mode 100644
index 0000000..fb3e1ac
--- /dev/null
+++ b/scrplugin/ds-annotations/pom.xml
@@ -0,0 +1,92 @@
+<!-- 
+ 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">
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>felix-parent</artifactId>
+        <groupId>org.apache.felix</groupId>
+        <version>1.2.0</version>
+        <relativePath>../pom/pom.xml</relativePath>
+    </parent>
+    
+    <groupId>org.apache.felix</groupId>
+    <artifactId>org.apache.felix.scr.ds-annotations</artifactId>
+
+    <!-- We use the same major version as the spec. -->
+    <version>1.2.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>Annotations for DS</name>
+    <description>
+        Annotations for generating OSGi service descriptors.
+    </description>
+
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/scrplugin/ds-annotations</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/scrplugin/ds-annotations</developerConnection>
+        <url>http://svn.apache.org/repos/asf/felix/scrplugin/ds-annotations</url>
+    </scm>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.generator</artifactId>
+            <version>1.2.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <version>4.3.0</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${basedir}/src/main/resources</directory>
+            </resource>
+            <resource>
+                <targetPath>META-INF</targetPath>
+                <directory>${basedir}</directory>
+                <includes>
+                    <include>LICENSE</include>
+                    <include>NOTICE</include>
+                    <include>DEPENDENCIES</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+
+          <!-- JDK 1.5 needed for annotation support -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                  <source>1.5</source>
+                  <target>1.5</target>
+                </configuration>
+            </plugin>
+            
+        </plugins>
+  </build>
+    
+</project>
diff --git a/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java b/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
new file mode 100644
index 0000000..780bf70
--- /dev/null
+++ b/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
@@ -0,0 +1,274 @@
+/*
+ * 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.scrplugin.ds;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.scrplugin.SCRDescriptorException;
+import org.apache.felix.scrplugin.SCRDescriptorFailureException;
+import org.apache.felix.scrplugin.annotations.AnnotationProcessor;
+import org.apache.felix.scrplugin.annotations.ClassAnnotation;
+import org.apache.felix.scrplugin.annotations.MethodAnnotation;
+import org.apache.felix.scrplugin.annotations.ScannedClass;
+import org.apache.felix.scrplugin.description.ClassDescription;
+import org.apache.felix.scrplugin.description.ComponentConfigurationPolicy;
+import org.apache.felix.scrplugin.description.ComponentDescription;
+import org.apache.felix.scrplugin.description.MethodDescription;
+import org.apache.felix.scrplugin.description.ReferenceCardinality;
+import org.apache.felix.scrplugin.description.ReferenceDescription;
+import org.apache.felix.scrplugin.description.ReferencePolicy;
+import org.apache.felix.scrplugin.description.ReferenceStrategy;
+import org.apache.felix.scrplugin.description.ServiceDescription;
+import org.apache.felix.scrplugin.description.SpecVersion;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Modified;
+import org.osgi.service.component.annotations.Reference;
+
+/**
+ * This is the processor for the DS annotations.
+ */
+public class DSAnnotationProcessor implements AnnotationProcessor {
+
+    /**
+     * @see org.apache.felix.scrplugin.annotations.AnnotationProcessor#process(org.apache.felix.scrplugin.annotations.ScannedClass, org.apache.felix.scrplugin.description.ClassDescription)
+     */
+    public void process(final ScannedClass scannedClass,
+                        final ClassDescription describedClass)
+    throws SCRDescriptorFailureException, SCRDescriptorException {
+        final List<ClassAnnotation> componentTags = scannedClass.getClassAnnotations(Component.class.getName());
+        scannedClass.processed(componentTags);
+
+        for (final ClassAnnotation cad : componentTags) {
+            this.createComponent(cad, describedClass, scannedClass);
+        }
+
+        // search for the component descriptions and use the first one
+        final List<ComponentDescription> componentDescs = describedClass.getDescriptions(ComponentDescription.class);
+        ComponentDescription found = null;
+        if (!componentDescs.isEmpty()) {
+            found = componentDescs.get(0);
+        }
+
+        if (found != null) {
+            final ComponentDescription cd = found;
+
+            // search for methods
+            final List<MethodAnnotation> methodTags = scannedClass.getMethodAnnotations(null);
+            for (final MethodAnnotation m : methodTags) {
+                if (m.getName().equals(Activate.class.getName())) {
+                    cd.setActivate(new MethodDescription(m.getAnnotatedMethod()));
+                    scannedClass.processed(m);
+                } else if (m.getName().equals(Deactivate.class.getName())) {
+                    cd.setDeactivate(new MethodDescription(m.getAnnotatedMethod()));
+                    scannedClass.processed(m);
+                } else if (m.getName().equals(Modified.class.getName())) {
+                    cd.setModified(new MethodDescription(m.getAnnotatedMethod()));
+                    scannedClass.processed(m);
+                } else if (m.getName().equals(Reference.class.getName()) ) {
+                    this.processReference(describedClass, m);
+                    scannedClass.processed(m);
+                }
+            }
+
+        }
+    }
+
+    /**
+     * @see org.apache.felix.scrplugin.annotations.AnnotationProcessor#getRanking()
+     */
+    public int getRanking() {
+        return 300;
+    }
+
+    /**
+     * Create a component description.
+     *
+     * @param cad The component annotation for the class.
+     * @param scannedClass The scanned class.
+     */
+    private ComponentDescription createComponent(final ClassAnnotation cad,
+                    final ClassDescription describedClass,
+                    final ScannedClass scannedClass)
+    throws SCRDescriptorException {
+        final ComponentDescription component = new ComponentDescription(cad);
+        describedClass.add(component);
+
+        // Although not defined in the spec, we support abstract classes.
+        final boolean classIsAbstract = Modifier.isAbstract(scannedClass.getClass().getModifiers());
+        component.setAbstract(classIsAbstract);
+
+        // name
+        component.setName(cad.getStringValue("name", scannedClass.getScannedClass().getName()));
+
+        // services
+        final List<String> listedInterfaces = new ArrayList<String>();
+        if (cad.getValue("service") != null) {
+            final String[] interfaces = (String[]) cad.getValue("service");
+            for (final String t : interfaces) {
+                listedInterfaces.add(t);
+            }
+        } else {
+            // scan directly implemented interfaces
+            this.searchInterfaces(listedInterfaces, scannedClass.getScannedClass());
+        }
+        if ( listedInterfaces.size() > 0 ) {
+            final ServiceDescription serviceDesc = new ServiceDescription(cad);
+            describedClass.add(serviceDesc);
+
+            for(final String name : listedInterfaces) {
+                serviceDesc.addInterface(name);
+            }
+            serviceDesc.setServiceFactory(cad.getBooleanValue("servicefactory", false));
+        }
+
+        // factory
+        component.setFactory(cad.getStringValue("factory", null));
+
+        // enabled
+        if (cad.getValue("enabled") != null) {
+            component.setEnabled(cad.getBooleanValue("enabled", true));
+        }
+
+        // immediate
+        if (cad.getValue("immediate") != null) {
+            component.setEnabled(cad.getBooleanValue("immediate", false));
+        }
+
+        // TODO: property/properties
+
+        // xmlns
+        if (cad.getValue("xmlns") != null) {
+            final SpecVersion spec = SpecVersion.fromNamespaceUrl(cad.getValue("xmlns").toString());
+            if ( spec == null ) {
+                throw new SCRDescriptorException("Unknown xmlns attribute value: " + cad.getValue("xmlns"),
+                                describedClass.getSource(), -1);
+            }
+            component.setSpecVersion(spec);
+        }
+
+        // configuration policy
+        component.setConfigurationPolicy(ComponentConfigurationPolicy.valueOf(cad.getEnumValue("policy",
+                        ComponentConfigurationPolicy.OPTIONAL.name())));
+
+        // configuration pid (TODO)
+        component.setCreatePid(cad.getBooleanValue("createPid", true));
+
+        // no inheritance
+        component.setInherit(false);
+
+        return component;
+    }
+
+    /**
+     * Get all directly implemented interfaces
+     */
+    private void searchInterfaces(final List<String> interfaceList, final Class<?> javaClass) {
+        final Class<?>[] interfaces = javaClass.getInterfaces();
+        for (final Class<?> i : interfaces) {
+            interfaceList.add(i.getName());
+        }
+    }
+
+    /**
+     * Process a reference
+     */
+    private void processReference(final ClassDescription describedClass, final MethodAnnotation ad) {
+        final ReferenceDescription ref = new ReferenceDescription(ad);
+        describedClass.add(ref);
+
+        ref.setStrategy(ReferenceStrategy.EVENT);
+
+        final String methodName = ad.getAnnotatedMethod().getName();
+        final String defaultUnbindMethodName;
+        final String refNameByMethod;
+        if ( methodName.startsWith("add") ) {
+            refNameByMethod = methodName.substring(3);
+            defaultUnbindMethodName = "remove" + refNameByMethod;
+        } else if ( methodName.startsWith("set") ) {
+            refNameByMethod = methodName.substring(3);
+            defaultUnbindMethodName = "un" + refNameByMethod;
+        } else if ( methodName.startsWith("bind") ) {
+            refNameByMethod = methodName.substring(4);
+            defaultUnbindMethodName = "un" + refNameByMethod;
+        } else {
+            refNameByMethod = methodName;
+            defaultUnbindMethodName = "un" + refNameByMethod;
+        }
+        final String defaultUpdateMethodName = "updated" + refNameByMethod;
+
+        // bind method
+        ref.setBind(new MethodDescription(ad.getAnnotatedMethod()));
+        // unbind method
+        final String unbind = ad.getStringValue("unbind",
+                        this.hasMethod(describedClass, defaultUnbindMethodName) ? defaultUnbindMethodName : "-");
+        if ( !unbind.equals("-") ) {
+            ref.setUnbind(new MethodDescription(unbind));
+        }
+        // update method
+        final String update = ad.getStringValue("updated",
+                        this.hasMethod(describedClass, defaultUpdateMethodName) ? defaultUpdateMethodName : "-");
+        if ( !update.equals("-") ) {
+            ref.setUpdated(new MethodDescription(update));
+        }
+
+        // name
+        ref.setName(ad.getStringValue("name", refNameByMethod));
+        // service
+        final String serviceName = ad.getStringValue("service", null);
+        if ( serviceName != null ) {
+            ref.setInterfaceName(serviceName);
+        } else {
+            final Class<?>[] params = ad.getAnnotatedMethod().getParameterTypes();
+            if ( params != null && params.length > 0 ) {
+                ref.setInterfaceName(params[0].getName());
+            }
+        }
+        // cardinality
+        final String cardinality = ad.getEnumValue("cardinality", "MANDATORY");
+        if ( cardinality.equals("OPTIONAL") ) {
+            ref.setCardinality(ReferenceCardinality.OPTIONAL_UNARY);
+        } else if ( cardinality.equals("MULTIPLE") ) {
+            ref.setCardinality(ReferenceCardinality.OPTIONAL_MULTIPLE);
+        } else if ( cardinality.equals("AT_LEAST_ONE") ) {
+            ref.setCardinality(ReferenceCardinality.MANDATORY_MULTIPLE);
+        } else {
+            ref.setCardinality(ReferenceCardinality.MANDATORY_UNARY);
+        }
+
+        // policy
+        ref.setPolicy(ReferencePolicy.valueOf(ad.getEnumValue("policy", ReferencePolicy.STATIC.name())));
+        // target
+        ref.setTarget(ad.getStringValue("target", null));
+    }
+
+    private boolean hasMethod(final ClassDescription classDescription, final String name) {
+        final Method[] allMethods = classDescription.getDescribedClass().getDeclaredMethods();
+        for(final Method m : allMethods) {
+            if ( m.getName().equals(name) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/scrplugin/ds-annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.annotations.AnnotationProcessor b/scrplugin/ds-annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.annotations.AnnotationProcessor
new file mode 100644
index 0000000..8303823
--- /dev/null
+++ b/scrplugin/ds-annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.annotations.AnnotationProcessor
@@ -0,0 +1 @@
+org.apache.felix.scrplugin.ds.DSAnnotationProcessor
