diff --git a/org.apache.felix.scr.ant/changelog.txt b/org.apache.felix.scr.ant/changelog.txt
new file mode 100644
index 0000000..9785d91
--- /dev/null
+++ b/org.apache.felix.scr.ant/changelog.txt
@@ -0,0 +1,206 @@
+Changes from 1.18.0 to 1.19.0
+-----------------------------
+** Bug
+    * [FELIX-5464] - java.lang.NullPointerException at org.apache.felix.scrplugin.helper.ClassScanner.processClass(ClassScanner.java:207)
+    * [FELIX-5729] - NoSuchFieldError when @Reference referenceInterface type different than field type
+    * [FELIX-5730] - Different separators in localization attribute
+    * [FELIX-5771] - Metatype generation via bnd plugin creates incorrect file names
+
+
+Changes from 1.17.0 to 1.18.0
+-----------------------------
+** Bug
+    * [FELIX-5700] - Metatype generation wrongly puts properties files into metatype directory
+
+
+Changes from 1.17.0 to 1.16.0
+---------------------------
+** Bug
+    * [FELIX-5451] - Input/Output streams not properly closed in org.apache.felix.scr.generator
+    * [FELIX-5452] - SCR bnd plugin fails when embedding jars with optional/excluded dependencies
+
+
+Changes from 1.16.0 to 1.15.0
+-----------------------------
+** Improvement
+    * [FELIX-5373] - Improve failure message when enabling metatype and using no or private properties only
+** Bug
+    * [FELIX-5304] - SERVICE_PID property should not be created
+    * [FELIX-5328] - NoClassDefFound not wrapped in the ClassScanner
+    * [FELIX-5345] - Incorrect encoding in metatype props file
+
+
+Changes from 1.15.0 to 1.14.0
+-----------------------------
+** Bug
+    * [FELIX-5118] - Exception when running on jdk9-ea
+
+
+Changes from 1.14.0 to 1.13.0
+-----------------------------
+** Improvement
+    * [FELIX-4773] - Generated service component xml does not conform to XSD
+** Bug
+    * [FELIX-4861] - Metatype generation should fail if there is no configuration property
+    * [FELIX-4622] - Regression: SCR spec version detection incorrect for activate method
+    * [FELIX-4774] - Support for @Reference annotation with unbind method "-"
+
+
+Changes from 1.13.0 to 1.11.0
+-----------------------------
+** Improvement
+    * [FELIX-4586] - A field must be volatile if methods are generated for a dynamic reference
+** Bug
+    * [FELIX-4296] - Cannot deactivate service interface detection in DS annotations
+    * [FELIX-4587] - Update method is not verified
+
+
+Changes from 1.11.0 to 1.10.0
+-----------------------------
+** Improvement
+    * [FELIX-4461] - Update to ASM 5 for Java 8 compatibility
+
+
+Changes from 1.10.0 to 1.9.0
+----------------------------
+** Improvement
+    * [FELIX-4378] - Generate a metatype properties file if label/description are missing on @Component or @Property
+** Bug
+    * [FELIX-4379] - Properties, references and services from inherited classes are only used if the class has the component annotation
+    * [FELIX-4383] - Metatype generation should use component name (and not classname)
+    * [FELIX-4441] - The default value is not escaped correctly.
+    * [FELIX-4442] - Lifecycle methods with wrong arguments should be treated as an error
+
+
+Changes from 1.9.0 to 1.8.0
+---------------------------
+** Improvement
+    * [FELIX-4249] - Make the default error location 1,1 instead of 0,0
+** Bug
+    * [FELIX-4192] - SCR Generator fails with a NPE in case a class level Reference doesn't define a referenceInterface
+    * [FELIX-4010] - SCR Plugin aborts when scanning a Java 8 class file
+
+
+Changes from 1.8.0 to 1.7.0
+---------------------------
+** Improvement
+    * [FELIX-4175] - scr.ant task does not provide scanClasses option
+    * [FELIX-4101] - Create metatype.properties file when description and label are inlined
+    * [FELIX-4126] - Discontinue creation of single XML descriptor files 
+    * [FELIX-4170] - Deprecate inheritance of component descriptors
+
+
+Changes from 1.7.0 to 1.6.0
+---------------------------
+** Bug
+    * [FELIX-4058] - PropertyType password has a wrong type (passwort)
+
+
+Changes from 1.6.0 to 1.5.0
+---------------------------
+** Improvement
+    * [FELIX-4033] - Issue warning messages for redundant SCR annotation combinations and an error for declaring the service.id property
+    * [FELIX-4035] - Issue warning messages when metatype is be created, but no properties are defined
+** Bug
+    * [FELIX-4030] - Generated metatype file contains all metatype infos
+    * [FELIX-3542] - Escape property values used as Metatype default values
+
+
+Changes from 1.5.0 to 1.4.0
+----------------------------
+** Bug
+    * [FELIX-3917] - bind/unbind methods are not generated
+
+Changes from 1.4.0 to 1.3.0
+----------------------------
+** Improvement
+    * [FELIX-3794] - Use DS specification version per component
+    * [FELIX-3636] - Using @Service without @Component should log a warning
+    * [FELIX-2929] - Read @Property from interfaces of types annotated with @Component
+    * [FELIX-3169] - Add support for new PASSWORD attribute type of Metatype service
+    * [FELIX-3886] - Improve error message for empty *.java-File
+
+** Task
+    * [FELIX-3867] - Drop support for JDK 1.4 completely
+
+** Bug
+    * [FELIX-3815] - Maven SCR Plugin does not correctly set specVersion to 1.1 if bind method with two parameters are used (OSGi Comp 4.2 $112.3.1)
+    * [FELIX-3858] - Service descriptor written in wrong encoding
+    * [FELIX-3232] - SCR annotations @Activate @Deactivate @Modified in outer classes also affect nested classes, annotations in nested classes are ignored 
+
+
+Changes from 1.3.0 to 1.2.0
+---------------------------
+** Improvement
+    * [FELIX-3641] - Option to generate separate descriptor files
+    
+** Bug
+    * [FELIX-3788] - specVersion incorrectly determined, depends on class order
+    * [FELIX-3568] - java.lang.VerifyError from bundles compiled with maven-scr-plugin (java 7)
+    * [FELIX-3739] - scr-plugin: "Annotated method {0} not found"
+    * [FELIX-3793] - Property of type Character must use unicode value
+    * [FELIX-3653] - Define the "@Reference" annotation on class level without a "referenceInterface" parameter.
+
+
+Changes from 1.1.4 to 1.2.0
+---------------------------
+
+** Task
+    * [FELIX-3225] - Drop javadoc annotation support
+    * [FELIX-3552] - Implement new features of DS 1.2
+    * [FELIX-3550] - Reimplement the SCR Generator
+
+** Bug
+    * [FELIX-3571] - "Comparison method violates general contract!" error in maven-scr-plugin
+    * [FELIX-3510] - Non java files will be processed
+    * [FELIX-3269] - @Property is not properly parsed.
+    * [FELIX-3189] - Mixing full-qualified Reference annotations and imported one results in no References exported to seviceComponents.xml
+    * [FELIX-3606] - SCR Plugin: build failure on wildcard imports (e.g. java.util.*)
+    * [FELIX-3234] - @Property annotation raises exceptions on longValue=0L use 
+
+** Improvement
+    * [FELIX-3509] - Undocumented features "strictMode", "parseJavadoc" and "processAnnotations"
+    * [FELIX-2689] - Upgrade Descriptor generator to new parent POM and adapt legal files
+
+
+Changes from 1.1.2 to 1.1.4
+---------------------------
+
+** Bug
+    * [FELIX-2963] - scr annotations @Activate @Deactivate @Modified are not detected with class inheritance
+    * [FELIX-3117] - NullPointerException when not implementing interface that is defined with @Service
+    * [FELIX-3136] - Endless loop: JavaClassDescriptorManager.getJavaClassDescription()
+    * [FELIX-3113] - NPE in multi-module Maven project
+
+
+Changes from 1.1.0 to 1.1.2
+---------------------------
+
+** Bug
+    * [FELIX-2978] - Lookup reference policy does not work for inherited components
+    * [FELIX-2945] - SCR plugin: Parsing of "options" for property tag broken for java annotations
+    * [FELIX-2906] - @Property(cardinality=Integer.MAX_Int, ...) causes java.lang.NumberFormatException
+
+** Improvement
+    * [FELIX-2492] - scr plugin: using src annotations causes NoClassDefFoundError and other errors
+    * [FELIX-2908] - Use same mechanism to get single annotation values as for multiple annotation values
+
+
+Changes from 1.0.0 to 1.1.0
+---------------------------
+
+** Bug
+    * [FELIX-2704] - @Property(cardinality=Integer.MAX_Int, ...) causes java.lang.NumberFormatException
+    * [FELIX-2835] - SCR plugin: Parsing of "options" for property tag broken for javadoc annotations
+    * [FELIX-2731] - NPE while scanning sources with QDox
+    * [FELIX-2876] - <reference> element not generated when name is missing
+
+** Improvement
+    * [FELIX-2853] - Deprecate javadoc tags
+    * [FELIX-2753] - Support array of classes for @Service annotation
+    * [FELIX-2874] - Add new scopes to SlingFilter annotation and use new property names
+    * [FELIX-2838] - Allow classes to be specifed as values for the @Property annotation
+    * [FELIX-2863] - Warnings and error messages contain @scr.* if annotations are used
+    * [FELIX-2690] - Add changelog.txt to SCR/Metatype generation modules
+
+
diff --git a/org.apache.felix.scr.ant/pom.xml b/org.apache.felix.scr.ant/pom.xml
new file mode 100644
index 0000000..5810dd7
--- /dev/null
+++ b/org.apache.felix.scr.ant/pom.xml
@@ -0,0 +1,110 @@
+<!-- 
+ 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>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>felix-parent</artifactId>
+        <version>4</version>
+        <relativePath>../../pom/pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.felix</groupId>
+    <artifactId>org.apache.felix.scr.ant</artifactId>
+
+    <version>1.18.0</version>
+    <packaging>jar</packaging>
+
+    <name>SCR Ant Task</name>
+    <description>
+        Implements the Ant Task to generate Declarative Services and Metatype
+        Service descriptors from Java 5 annotations and/or JavaDoc tags.
+    </description>
+
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/releases/org.apache.felix.scr.ant-1.18.0</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.scr.ant-1.18.0</developerConnection>
+        <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.scr.ant-1.18.0</url>
+    </scm>
+
+    <properties>
+        <felix.java.version>6</felix.java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.ant</groupId>
+            <artifactId>ant</artifactId>
+            <version>1.7.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.generator</artifactId>
+            <version>1.18.0</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <version>1.12.0</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.ds-annotations</artifactId>
+            <version>1.2.10</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ow2.asm</groupId>
+            <artifactId>asm-all</artifactId>
+            <version>5.1</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+    
+    <build>
+        <plugins>
+            <!-- unpack qdox, asm and annotations into bundle package -->
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>unpack-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <includeArtifactIds>
+                                org.apache.felix.scr.generator,asm-all,org.apache.felix.scr.annotations,org.apache.felix.scr.ds-annotations
+                            </includeArtifactIds>
+                            <outputDirectory>
+                                ${project.build.outputDirectory}
+                            </outputDirectory>
+                            <excludes>
+                                **/MANIFEST.MF
+                            </excludes>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+      </plugins>
+    </build>
+</project>
diff --git a/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/DEPENDENCIES b/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/DEPENDENCIES
new file mode 100644
index 0000000..2725f76
--- /dev/null
+++ b/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/DEPENDENCIES
@@ -0,0 +1,18 @@
+I. Included Third-Party Software
+
+This product includes software developed at http://asm.objectweb.org
+Copyright (c) 2000-2011 INRIA, France Telecom
+Licensed under the BSD License.
+
+
+II. Used Third-Party Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2009).
+Licensed under the Apache License 2.0. 
+
+
+III. License Summary
+- Apache License 2.0
+- BSD License
diff --git a/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/LICENSE b/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/LICENSE
new file mode 100644
index 0000000..acc4bbd
--- /dev/null
+++ b/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/LICENSE
@@ -0,0 +1,31 @@
+For the asm component:
+
+Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/NOTICE b/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/NOTICE
new file mode 100644
index 0000000..47119b9
--- /dev/null
+++ b/org.apache.felix.scr.ant/src/main/appended-resources/META-INF/NOTICE
@@ -0,0 +1,7 @@
+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 http://asm.objectweb.org
+Copyright (c) 2000-2011 INRIA, France Telecom
+Licensed under the BSD License.
diff --git a/org.apache.felix.scr.ant/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java b/org.apache.felix.scr.ant/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
new file mode 100644
index 0000000..076620a
--- /dev/null
+++ b/org.apache.felix.scr.ant/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
@@ -0,0 +1,160 @@
+/*
+ * 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.ant;
+
+
+import org.apache.felix.scrplugin.Log;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+
+public class AntLog implements Log
+{
+
+    private final Task task;
+
+
+    AntLog( final Task task )
+    {
+        this.task = task;
+    }
+
+
+    public boolean isDebugEnabled()
+    {
+        // cannot tell, assume yes
+        return true;
+    }
+
+
+    public void debug( String content )
+    {
+        task.log( content, Project.MSG_DEBUG );
+    }
+
+
+    public void debug( String content, Throwable error )
+    {
+        task.log( content, error, Project.MSG_DEBUG );
+    }
+
+
+    public void debug( Throwable error )
+    {
+        task.log( error, Project.MSG_DEBUG );
+    }
+
+
+    public boolean isInfoEnabled()
+    {
+        // cannot tell, assume yes
+        return true;
+    }
+
+
+    public void info( String content )
+    {
+        task.log( content, Project.MSG_INFO );
+    }
+
+
+    public void info( String content, Throwable error )
+    {
+        task.log( content, error, Project.MSG_INFO );
+    }
+
+
+    public void info( Throwable error )
+    {
+        task.log( error, Project.MSG_INFO );
+    }
+
+
+    public boolean isWarnEnabled()
+    {
+        // cannot tell, assume yes
+        return true;
+    }
+
+
+    public void warn( String content )
+    {
+        task.log( content, Project.MSG_WARN );
+    }
+
+
+    public void warn( String content, String location, int lineNumber )
+    {
+        warn( String.format( "%s [%s,%d]", content, location, lineNumber ) );
+    }
+
+    public void warn( String content, String location, int lineNumber, int columNumber )
+    {
+    	warn( String.format( "%s [%s,%d:%d]", content, location, lineNumber , columNumber) );
+    }
+
+
+    public void warn( String content, Throwable error )
+    {
+        task.log( content, error, Project.MSG_WARN );
+    }
+
+
+    public void warn( Throwable error )
+    {
+        task.log( error, Project.MSG_WARN );
+    }
+
+
+    public boolean isErrorEnabled()
+    {
+        // cannot tell, assume yes
+        return true;
+    }
+
+
+    public void error( String content )
+    {
+        task.log( content, Project.MSG_ERR );
+    }
+
+
+    public void error( String content, String location, int lineNumber )
+    {
+        error( String.format( "%s [%s,%d]", content, location, lineNumber ) );
+    }
+
+    public void error( String content, String location, int lineNumber, int columnNumber )
+    {
+    	error( String.format( "%s [%s,%d:%d]", content, location, lineNumber, columnNumber ) );
+    }
+    
+
+    public void error( String content, Throwable error )
+    {
+        task.log( content, error, Project.MSG_ERR );
+    }
+
+
+    public void error( Throwable error )
+    {
+        task.log( error, Project.MSG_ERR );
+    }
+
+}
diff --git a/org.apache.felix.scr.ant/src/main/java/org/apache/felix/scrplugin/ant/SCRDescriptorTask.java b/org.apache.felix.scr.ant/src/main/java/org/apache/felix/scrplugin/ant/SCRDescriptorTask.java
new file mode 100644
index 0000000..85dd3f7
--- /dev/null
+++ b/org.apache.felix.scr.ant/src/main/java/org/apache/felix/scrplugin/ant/SCRDescriptorTask.java
@@ -0,0 +1,242 @@
+/*
+ * 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.ant;
+
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.felix.scrplugin.Options;
+import org.apache.felix.scrplugin.SCRDescriptorException;
+import org.apache.felix.scrplugin.SCRDescriptorFailureException;
+import org.apache.felix.scrplugin.SCRDescriptorGenerator;
+import org.apache.felix.scrplugin.Source;
+import org.apache.felix.scrplugin.SpecVersion;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Location;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.resources.FileResource;
+
+
+/**
+ * The <code>SCRDescriptorTask</code> generates a service descriptor file based
+ * on annotations found in the sources.
+ */
+public class SCRDescriptorTask extends MatchingTask {
+
+    private File destdir;
+
+    private Path classpath;
+
+    /**
+     * This flag controls the generation of the bind/unbind methods.
+     */
+    private boolean generateAccessors = true;
+
+    /**
+     * In strict mode the plugin even fails on warnings.
+     */
+    protected boolean strictMode = false;
+
+    /**
+     * Set to true to scan classes instead of sources.
+     * By default scan sources to be backwards compatible
+     */
+    private boolean scanClasses = false;
+
+    /**
+     * The version of the DS spec this plugin generates a descriptor for. By
+     * default the version is detected by the used tags.
+     *
+     * @parameter
+     */
+    private String specVersion;
+
+
+    @Override
+    public void execute() throws BuildException {
+
+        // ensure we know the source
+        if (getImplicitFileSet().getDir() == null) {
+            throw new BuildException( "srcdir attribute must be set!", getLocation());
+        }
+
+        // while debugging
+        final org.apache.felix.scrplugin.Log scrLog = new AntLog( this );
+
+        scrLog.debug( "SCRDescriptorTask Configuration" );
+        scrLog.debug( "  implicitFileset: " + getImplicitFileSet() );
+        scrLog.debug( "  outputDirectory: " + destdir );
+        scrLog.debug( "  classpath: " + classpath );
+        scrLog.debug( "  generateAccessors: " + generateAccessors );
+        scrLog.debug( "  strictMode: " + strictMode );
+        scrLog.debug( "  specVersion: " + specVersion );
+
+        try {
+            final Path classPath = createClasspath();
+            final org.apache.felix.scrplugin.Project project = new org.apache.felix.scrplugin.Project();
+            project.setClassLoader(getClassLoader( this.getClass().getClassLoader() ));
+
+            project.setDependencies(getDependencies(classPath));
+            project.setSources(getSourceFiles(getImplicitFileSet()));
+            project.setClassesDirectory(destdir.getAbsolutePath());
+
+            // create options
+            final Options options = new Options();
+            options.setOutputDirectory(destdir);
+            options.setGenerateAccessors(generateAccessors);
+            options.setStrictMode(strictMode);
+            options.setProperties(new HashMap<String, String>());
+            options.setSpecVersion(SpecVersion.fromName(specVersion));
+            if ( specVersion != null && options.getSpecVersion() == null ) {
+                throw new BuildException("Unknown spec version specified: " + specVersion);
+            }
+
+            final SCRDescriptorGenerator generator = new SCRDescriptorGenerator( scrLog );
+
+            // setup from plugin configuration
+            generator.setOptions(options);
+            generator.setProject(project);
+
+            generator.execute();
+        } catch ( final SCRDescriptorException sde ) {
+            if ( sde.getSourceLocation() != null )  {
+                final Location loc = new Location( sde.getSourceLocation(), -1, 0 );
+                throw new BuildException( sde.getMessage(), sde.getCause(), loc );
+            }
+            throw new BuildException( sde.getMessage(), sde.getCause() );
+        } catch ( SCRDescriptorFailureException sdfe ) {
+            throw new BuildException( sdfe.getMessage(), sdfe.getCause() );
+        }
+    }
+
+    protected Collection<Source> getSourceFiles(final FileSet sourceFiles) {
+        final String prefix = sourceFiles.getDir().getAbsolutePath();
+        final int prefixLength = prefix.length() + 1;
+
+        final List<Source> result = new ArrayList<Source>();
+        @SuppressWarnings("unchecked")
+        final Iterator<Resource> resources = sourceFiles.iterator();
+
+        final String ext;
+        if(scanClasses) {
+            ext = ".class";
+        } else {
+            ext = ".java";
+        }
+
+        while ( resources.hasNext() ) {
+            final Resource r = resources.next();
+            if ( r instanceof FileResource ) {
+                final File file = ( ( FileResource ) r ).getFile();
+
+                if ( file.getName().endsWith(ext) ) {
+                    result.add(new Source() {
+
+                        public File getFile() {
+                            return file;
+                        }
+
+                        public String getClassName() {
+                            String name = file.getAbsolutePath().substring(prefixLength).replace(File.separatorChar, '/').replace('/', '.');
+                            return name.substring(0, name.length() - ext.length());
+                        }
+                    });
+                }
+            }
+        }
+
+        return result;
+    }
+
+
+    private List<File> getDependencies(final Path classPath) {
+        ArrayList<File> files = new ArrayList<File>();
+        for ( String entry : classPath.list() ) {
+            File file = new File( entry );
+            if ( file.isFile() ) {
+                files.add( file );
+            }
+        }
+        return files;
+    }
+
+    private ClassLoader getClassLoader( final ClassLoader parent ) throws BuildException {
+        Path classPath = createClasspath();
+        log( "Using classes from: " + classPath, Project.MSG_DEBUG );
+        return getProject().createClassLoader( parent, classpath );
+    }
+
+
+    // ---------- setters for configuration fields
+
+    public Path createClasspath() {
+        if ( this.classpath == null ) {
+            this.classpath = new Path( getProject() );
+        }
+        return this.classpath;
+    }
+
+    public void setClasspath( Path classPath ) {
+        createClasspath().add( classPath );
+    }
+
+    public void setClasspathRef( Reference classpathRef ) {
+        if ( classpathRef != null && classpathRef.getReferencedObject() instanceof Path ) {
+            createClasspath().add( ( Path ) classpathRef.getReferencedObject() );
+        }
+    }
+
+    public void setSrcdir( File srcdir )  {
+        getImplicitFileSet().setDir( srcdir );
+    }
+
+    public void setDestdir( File outputDirectory ) {
+        this.destdir = outputDirectory;
+        if ( destdir != null ) {
+            Path dst = new Path( getProject() );
+            dst.setLocation( destdir );
+            createClasspath().add( dst );
+        }
+    }
+
+    public void setGenerateAccessors( boolean generateAccessors ) {
+        this.generateAccessors = generateAccessors;
+    }
+
+    public void setStrictMode( boolean strictMode ) {
+        this.strictMode = strictMode;
+    }
+
+    public void setSpecVersion( String specVersion ) {
+        this.specVersion = specVersion;
+    }
+
+    public boolean isScanClasses() {
+        return scanClasses;
+    }
+
+    public void setScanClasses(boolean scanClasses) {
+        this.scanClasses = scanClasses;
+    }
+}
diff --git a/org.apache.felix.scr.ant/src/main/resources/scrtask.properties b/org.apache.felix.scr.ant/src/main/resources/scrtask.properties
new file mode 100644
index 0000000..d2b975f
--- /dev/null
+++ b/org.apache.felix.scr.ant/src/main/resources/scrtask.properties
@@ -0,0 +1,21 @@
+#
+#  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.
+#
+
+# Define the ANT Tasks provided in this library
+scr=org.apache.felix.scrplugin.ant.SCRDescriptorTask
\ No newline at end of file
