diff --git a/dependencymanager/annotation/doc/changelog.txt b/dependencymanager/annotation/doc/changelog.txt
index 0ea1c46..69e4653 100644
--- a/dependencymanager/annotation/doc/changelog.txt
+++ b/dependencymanager/annotation/doc/changelog.txt
@@ -10,6 +10,7 @@
     * [FELIX-2956] - json should be embedded in the annotation scanner plugin
     * [FELIX-2966] - Annotations should automatically generate Import-Service/Export-Service headers
     * [FELIX-2965] - Annotations should allow to enable or disable auto-configuration mode.
+    * [FELIX-3863] - Generate DependencyManager Annotation MetaData In Project Folder
 
 Initial Release 3.0.0
 ---------------------
diff --git a/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/bnd/AnnotationPlugin.java b/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/bnd/AnnotationPlugin.java
index 35c9077..e8de8ee 100644
--- a/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/bnd/AnnotationPlugin.java
+++ b/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/bnd/AnnotationPlugin.java
@@ -48,11 +48,11 @@
     /**
      * This plugin is called after analysis of the JAR but before manifest
      * generation. When some DM annotations are found, the plugin will add the corresponding 
-     * DM component descriptors under OSGI-INF/ directory. It will also set the  
+     * DM component descriptors under META-INF/ directory. It will also set the  
      * "DependencyManager-Component" manifest header (which references the descriptor paths).
      * 
      * @param analyzer the object that is used to retrieve classes containing DM annotations.
-     * @return true if the classpace has been modified so that the bundle classpath must be reanalyzed
+     * @return true if the classpath has been modified so that the bundle classpath must be reanalyzed
      * @throws Exception on any errors.
      */
     public boolean analyzeJar(Analyzer analyzer) throws Exception
@@ -90,7 +90,7 @@
                     analyzer.getJar().putResource(entry.getKey(), entry.getValue());
                 }
 
-                // Inser the metatype resource, if any.
+                // Insert the metatype resource, if any.
                 Resource metaType = generator.getMetaTypeResource();
                 if (metaType != null)
                 {
diff --git a/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/mvn/AnnotationMojo.java b/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/mvn/AnnotationMojo.java
index 7672879..ad9f4c7 100644
--- a/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/mvn/AnnotationMojo.java
+++ b/dependencymanager/annotation/src/main/java/org/apache/felix/dm/annotation/plugin/mvn/AnnotationMojo.java
@@ -18,8 +18,12 @@
  */
 package org.apache.felix.dm.annotation.plugin.mvn;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Map;
 import java.util.Set;
 
@@ -36,7 +40,7 @@
 /**
  * The <code>AnnotationMojo</code>
  * generates a Dependency Manager component descriptor file based on annotations found from java classes.
- *
+ * 
  * @goal scan
  * @phase package
  * @description Build DependencyManager component descriptors from class annotations.
@@ -47,7 +51,7 @@
 {
     /**
      * The Maven project.
-     *
+     * 
      * @parameter expression="${project}"
      * @required
      * @readonly
@@ -56,7 +60,7 @@
 
     /**
      * The target extension
-     *
+     * 
      * @parameter default-value="jar"
      * @required
      */
@@ -64,19 +68,35 @@
 
     /**
      * If set, configures the log level.
-     *
+     * 
      * @parameter alias="log"
      */
     private String m_log;
 
     /**
      * If set, configures if we must auto generate Import-Service/Export-Service headers.
-     *
+     * 
      * @parameter alias="build-import-export-service" default-value="true"
      */
     private boolean m_buildImportExportService;
 
     /**
+     * The maven project bas directory, used when generating metadata in maven project directory.
+     * 
+     * @parameter expression="${project.basedir}"
+     * @required
+     * @readonly
+     */
+    private File m_projectBaseDir;
+    
+    /**
+     * If set, configures the output directory where generated descriptor files are generated.
+     * 
+     * @parameter alias="generated-output-dir"
+     */
+    private String m_generatedOutputDir;
+
+    /**
      * "Import-Service" osgi header
      */
     private static final String IMPORT_SERVICE = "Import-Service";
@@ -87,7 +107,8 @@
     private static final String EXPORT_SERVICE = "Export-Service";
 
     /**
-     * Executes this mojo. We'll use the bnd library in order to scan classes from our target bundle.
+     * Executes this mojo. We'll use the bnd library in order to scan classes
+     * from our target bundle.
      */
     public void execute() throws MojoExecutionException
     {
@@ -111,29 +132,34 @@
             // Start scanning
             if (generator.execute())
             {
-                // Some annotations have been parsed. 
-                // Add the list of generated component descriptors in our special header.
+                // Some annotations have been parsed.
+                // Add the list of generated component descriptors in our
+                // special header.
                 jar = analyzer.getJar();
-                jar.getManifest().getMainAttributes().putValue("DependencyManager-Component",
-                                                               generator.getDescriptorPaths());
+                jar.getManifest().getMainAttributes()
+                    .putValue( "DependencyManager-Component", generator.getDescriptorPaths() );
 
-                // Add generated descriptors into the target bundle (we'll use a temp file).
+                // Add generated descriptors into the target bundle (we'll use a
+                // temp file).
                 Map<String, Resource> resources = generator.getDescriptors();
                 for (Map.Entry<String, Resource> entry : resources.entrySet())
                 {
+                    addResource(entry.getKey(), entry.getValue().openInputStream());
                     jar.putResource(entry.getKey(), entry.getValue());
                 }
 
                 Resource metaType = generator.getMetaTypeResource();
                 if (metaType != null)
                 {
+                    addResource("OSGI-INF/metatype/metatype.xml", metaType.openInputStream());
                     jar.putResource("OSGI-INF/metatype/metatype.xml", metaType);
                 }
 
                 // Possibly set the Import-Service/Export-Service header
                 if (m_buildImportExportService)
                 {
-                    // Don't override Import-Service header, if it is found from the bnd directives.
+                    // Don't override Import-Service header, if it is found from
+                    // the bnd directives.
                     if (jar.getManifest().getMainAttributes().getValue(IMPORT_SERVICE) == null)
                     {
                         buildImportExportService(jar, IMPORT_SERVICE, generator.getImportService());
@@ -170,6 +196,29 @@
         }
     }
 
+    /**
+     * Adds a resource file into the project base directory
+     * @param key
+     * @param in
+     * @throws IOException
+     */
+    private void addResource(String key, InputStream in) throws IOException
+    {
+        if (m_generatedOutputDir != null) {
+            File descriptorFile = new File( m_projectBaseDir + File.separator + m_generatedOutputDir, key );
+            descriptorFile.getParentFile().mkdirs();
+            BufferedInputStream bin = new BufferedInputStream( in );
+            BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream( descriptorFile ) );
+            int b;
+            while ( ( b = bin.read() ) != -1 )
+            {
+                out.write( b );
+            }
+            out.close();
+            bin.close();
+        }
+    }
+
     private void buildImportExportService(Jar jar, String header, Set<String> services) throws IOException
     {
         getLog().info("building " + header + " header with the following services: " + services);
@@ -189,6 +238,7 @@
 
     /**
      * Returns the target name of this maven project.
+     * 
      * @return the target name of this maven project.
      */
     private File getBundleName()
@@ -200,6 +250,7 @@
 
     /**
      * Copy the generated jar into our target bundle.
+     * 
      * @param jar the jar with the generated component descriptors
      * @param target our target bundle
      * @throws MojoExecutionException on any errors
