diff --git a/tools/maven2/maven-osgi-plugin/pom.xml b/tools/maven2/maven-osgi-plugin/pom.xml
index d43934a..a895d15 100644
--- a/tools/maven2/maven-osgi-plugin/pom.xml
+++ b/tools/maven2/maven-osgi-plugin/pom.xml
@@ -1,45 +1,28 @@
 <project>
+  <parent>
+    <artifactId>maven-plugin-parent</artifactId>
+    <groupId>org.apache.maven.plugins</groupId>
+    <version>2.0</version>
+  </parent>
   <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-osgi-plugin</artifactId>
   <packaging>maven-plugin</packaging>
   <name>Maven OSGi Plugin</name>
-  <version>0.1.2</version>
+  <version>0.3.0</version>
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0-beta-1</version>
+      <artifactId>maven-archiver</artifactId>
+      <version>2.0</version>
     </dependency>
     <dependency>
-        <groupId>org.apache.maven</groupId>
-        <artifactId>maven-archiver</artifactId>
-        <version>2.0-beta-1</version>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
     </dependency>
     <dependency>
-        <groupId>org.apache.maven</groupId>
-        <artifactId>maven-project</artifactId>
-        <version>2.0-beta-1</version>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <version>2.0</version>
     </dependency>
-    <dependency>
-        <groupId>org.apache.maven</groupId>
-        <artifactId>maven-archiver</artifactId>
-        <version>2.0-beta-1</version>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.maven</groupId>
-        <artifactId>maven-project</artifactId>
-        <version>2.0-beta-1</version>
-    </dependency>
-      <dependency>
-          <groupId>plexus</groupId>
-          <artifactId>plexus-archiver</artifactId>
-          <version>1.0-alpha-2</version>
-      </dependency>
-      <dependency>
-        <groupId>plexus</groupId>
-        <artifactId>plexus-utils</artifactId>
-        <version>1.0.3</version>
-      </dependency>
   </dependencies>
 </project>
diff --git a/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java
index 0b7bc821..1ac38bf 100644
--- a/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java
+++ b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java
@@ -1,69 +1,58 @@
 /*
- * Copyright 2001-2005 The Apache Software Foundation.
+ *   Copyright 2005 The Apache Software Foundation
  *
- * 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
+ *   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
+ *       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.
+ *   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.tools.maven.plugin;
 
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.archiver.MavenArchiver;
-import org.apache.maven.archiver.MavenArchiveConfiguration;
-import org.apache.maven.artifact.Artifact;
-import org.codehaus.plexus.archiver.jar.JarArchiver;
-import org.codehaus.plexus.util.FileUtils;
-
 import java.io.File;
-import java.util.List;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.maven.archiver.MavenArchiveConfiguration;
+import org.apache.maven.archiver.MavenArchiver;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.archiver.jar.JarArchiver;
+import org.codehaus.plexus.archiver.jar.ManifestException;
+import org.codehaus.plexus.util.FileUtils;
+
 /**
- * @author <a href="tbennett@apache.org">Timothy Bennett</a>
- * @goal osgi-jar
+ * Package an OSGi jar "bundle."
+ * 
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Apache Felix Project</a>
+ * @version $Rev$, $Date$
+ * @goal osgi-bundle
  * @phase package
  * @requiresDependencyResolution runtime
- * @description build a OSGi bundle jar
+ * @description build an OSGi bundle jar
  */
-public class OsgiJarMojo extends AbstractMojo {
-    private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"};
-    private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"};
+public class OsgiJarMojo extends AbstractMojo
+{
+    private static final String[] EMPTY_STRING_ARRAY = {};
 
     /**
-     * @todo Change type to File
-     *
-     * @parameter expression="${project.build.directory}"
-     * @required
-     * @readonly
-     */
-    private String basedir;
-
-    /**
-     * @parameter alias="jarName" expression="${project.build.finalName}"
-     * @required
-     */
-    private String finalName;
-
-    /**
-     * @parameter expression="${project.build.outputDirectory}"
-     * @required
-     * @readonly
-     */
-    private String outputDirectory;
-
-    /**
+     * The Maven project.
      * @parameter expression="${project}"
      * @required
      * @readonly
@@ -71,6 +60,59 @@
     private MavenProject project;
 
     /**
+     * The directory for the generated JAR.
+     *
+     * @parameter expression="${project.build.directory}"
+     * @required
+     */
+    private String buildDirectory;
+
+    /**
+     * The directory containing generated classes.
+     *
+     * @parameter expression="${project.build.outputDirectory}"
+     * @required
+     * @readonly
+     */
+    private File outputDirectory;
+
+    /**
+     * The name of the generated JAR file.
+     * 
+     * @parameter alias="jarName" expression="${project.build.finalName}"
+     * @required
+     */
+    private String jarName;
+
+    /**
+     * The Jar archiver.
+     *
+     * @parameter expression="${component.org.codehaus.plexus.archiver.Archiver#jar}"
+     * @required
+     */
+    private JarArchiver jarArchiver;
+
+    /**
+     * The maven archive configuration to use.
+     */
+    private MavenArchiveConfiguration archiveConfig = new MavenArchiveConfiguration();
+
+    /**
+     * The comma separated list of tokens to include in the JAR.
+     * Default is '**'.
+     *
+     * @parameter alias="includes"
+     */
+    private String jarSourceIncludes = "**";
+
+    /**
+     * The comma separated list of tokens to exclude from the JAR.
+     *
+     * @parameter alias="excludes"
+     */
+    private String jarSourceExcludes;
+
+    /**
      * @parameter
      */
     private String manifestFile;
@@ -81,97 +123,179 @@
     private OsgiManifest osgiManifest;
 
     /**
-     * @parameter
+     * Execute this Mojo
+     * 
+     * @throws MojoExecutionException
      */
-    private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+    public void execute() throws MojoExecutionException
+    {
+        File jarFile = new File( buildDirectory, jarName + ".jar" );
+
+        try
+        {
+            performPackaging( jarFile );
+        }
+        catch ( Exception e )
+        {
+            throw new MojoExecutionException( "Error assembling JAR bundle", e );
+        }
+    }
 
     /**
-     * @todo Add license files in META-INF directory.
+     * Generates the JAR bundle file.
+     *
+     * @param  jarFile the target JAR file
+     * @throws IOException
+     * @throws ArchiverException
+     * @throws ManifestException
+     * @throws DependencyResolutionRequiredException
      */
-    public void execute() throws MojoExecutionException {
-        File jarFile = new File(basedir, finalName + "-bundle.jar");
+    private void performPackaging( File jarFile ) throws IOException, ArchiverException, ManifestException,
+            DependencyResolutionRequiredException, MojoExecutionException
+    {
+        getLog().info( "Generating JAR bundle " + jarFile.getAbsolutePath() );
 
         MavenArchiver archiver = new MavenArchiver();
-        archiver.setOutputFile(jarFile);
 
-        /*
-            TODO: Decide if we accept merging of entire manifest.mf files
-            Here's a big question to make a final decision at some point: Do accept
-            merging of manifest entries located in some file somewhere in the project
-            directory?  If so, do we allow both file and configuration based entries
-            to be specified simultaneously and how do we merge these?
-        */
-        if (manifestFile != null) {
-            File file = new File(project.getBasedir().getAbsolutePath(), manifestFile);
-            getLog().info("Manifest file: " + file.getAbsolutePath() + " will be used");
-            archive.setManifestFile(file);
-        } else {
-            getLog().info("No manifest file specified. Default will be used.");
+        archiver.setArchiver( jarArchiver );
+        archiver.setOutputFile( jarFile );
+
+        addManifestFile();
+        addManifestEntries();
+
+        addBundleClasspath();
+        addBundleVersion();
+
+        jarArchiver.addDirectory( outputDirectory, getIncludes(), getExcludes() );
+
+        archiver.createArchive( project, archiveConfig );
+
+        project.getArtifact().setFile( jarFile );
+    }
+
+    /**
+     * TODO: Decide if we accept merging of entire manifest.mf files
+     * Here's a big question to make a final decision at some point: Do accept
+     * merging of manifest entries located in some file somewhere in the project
+     * directory?  If so, do we allow both file and configuration based entries
+     * to be specified simultaneously and how do we merge these?
+     */
+    private void addManifestFile()
+    {
+        if ( manifestFile != null )
+        {
+            File file = new File( project.getBasedir().getAbsolutePath(), manifestFile );
+            getLog().info( "Manifest file: " + file.getAbsolutePath() + " will be used" );
+            archiveConfig.setManifestFile( file );
         }
+        else
+        {
+            getLog().info( "No manifest file specified. Default will be used." );
+        }
+    }
 
-        // Look for any OSGi specified manifest entries in the maven-felix-plugin configuration
-        // section of the POM.  If we find some, then add them to the target artifact's manifest.
-        if (osgiManifest != null) {
+    /**
+     * Look for any OSGi specified manifest entries in the maven-osgi-plugin configuration
+     * section of the POM.  If we find some, then add them to the target artifact's manifest.
+     */
+    private void addManifestEntries()
+    {
+        if ( osgiManifest != null && osgiManifest.getEntries().size() > 0 )
+        {
             Map entries = osgiManifest.getEntries();
-            if (entries.size() != 0) {
-                getLog().info("OSGi bundle manifest entries have been specified." +
-                        " Bundle manifest will be modified with the following entries: " + entries.toString());
-                archive.addManifestEntries(entries);
-            } else {
-                getLog().info("No OSGi bundle manifest entries have been specified.  Bundle manifest will not be modified");
-            }
-        } else {
-            getLog().info("No OSGi bundle manifest entries have been specified.  Bundle manifest will not be modified");
+
+            getLog().info( "Bundle manifest will be modified with the following entries: " + entries.toString() );
+            archiveConfig.addManifestEntries( entries );
         }
+        else
+        {
+            getLog().info( "No OSGi bundle manifest entries have been specified in the POM." );
+        }
+    }
 
-        /*
-            We are going to iterate thru the POM's specified jar dependencies.  If a dependency
-            has a scope of either RUNTIME or COMPILE, then we'll jar them up inside the
-            OSGi bundle artifact.
-
-            We are also going to automatically construct the Bundle-Classpath manifest entry.
-        */
+    /**
+     * We are going to iterate through the POM's specified JAR dependencies.  If a dependency
+     * has a scope of either RUNTIME or COMPILE, then we'll JAR them up inside the
+     * OSGi bundle artifact.  We will then add the Bundle-Classpath manifest entry.
+     */
+    private void addBundleClasspath() throws MojoExecutionException
+    {
         StringBuffer bundleClasspath = new StringBuffer();
         Set artifacts = project.getArtifacts();
-        for (Iterator iter = artifacts.iterator(); iter.hasNext();) {
-            Artifact artifact = (Artifact) iter.next();
-            if (!Artifact.SCOPE_PROVIDED.equals(artifact.getScope()) &&
-                    !Artifact.SCOPE_TEST.equals(artifact.getScope())) {
+
+        for ( Iterator it = artifacts.iterator(); it.hasNext(); )
+        {
+            Artifact artifact = (Artifact) it.next();
+            if ( !Artifact.SCOPE_PROVIDED.equals( artifact.getScope() )
+                    && !Artifact.SCOPE_TEST.equals( artifact.getScope() ) )
+            {
                 String type = artifact.getType();
-                if ("jar".equals(type)) {
+
+                if ( "jar".equals( type ) )
+                {
                     File depFile = artifact.getFile();
-                    File outDir = new File(outputDirectory);
-                    try {
-                        FileUtils.copyFileToDirectory(depFile, outDir);
-                        if (bundleClasspath.length() == 0) bundleClasspath.append(".");
-                        bundleClasspath.append("," + artifact.getFile().getName());
-                    } catch (Exception e) {
-                        String errmsg = "Error copying " + depFile.getAbsolutePath() + " to " + outDir.getAbsolutePath();
-                        throw new MojoExecutionException(errmsg, e);
+
+                    try
+                    {
+                        FileUtils.copyFileToDirectory( depFile, outputDirectory );
+
+                        if ( bundleClasspath.length() == 0 )
+                        {
+                            bundleClasspath.append( "." );
+                        }
+
+                        bundleClasspath.append( "," + artifact.getFile().getName() );
+                    }
+                    catch ( Exception e )
+                    {
+                        String errmsg = "Error copying " + depFile.getAbsolutePath() + " to "
+                                + outputDirectory.getAbsolutePath();
+                        throw new MojoExecutionException( errmsg, e );
                     }
                 }
             }
         }
-        if (bundleClasspath.length() != 0) {
-            archive.addManifestEntry("Bundle-ClassPath", bundleClasspath.toString());
-        }
-        bundleClasspath = null;
 
-        // auto-set the bundle version...
-        archive.addManifestEntry("Bundle-Version", project.getVersion());
+        String finalPath = bundleClasspath.toString();
 
-        // create the target bundle archive...
-        try {
-            File contentDirectory = new File(outputDirectory);
-            if (!contentDirectory.exists()) {
-                getLog().warn("Bundle archive JAR will be empty -- no content was marked for inclusion!");
-            } else {
-                archiver.getArchiver().addDirectory(contentDirectory, DEFAULT_INCLUDES, DEFAULT_EXCLUDES);
-            }
-            archiver.createArchive(project, archive);
-        } catch (Exception e) {
-            // TODO: improve error handling
-            throw new MojoExecutionException("Error assembling Bundle archive JAR", e);
+        if ( finalPath.length() != 0 )
+        {
+            archiveConfig.addManifestEntry( "Bundle-Classpath", finalPath );
         }
     }
+
+    /**
+     * Auto-set the bundle version.
+     */
+    private void addBundleVersion()
+    {
+        archiveConfig.addManifestEntry( "Bundle-Version", project.getVersion() );
+    }
+
+    /**
+     * Returns a string array of the includes to be used when assembling/copying the war.
+     *
+     * @return an array of tokens to include
+     */
+    private String[] getIncludes()
+    {
+        return new String[] { jarSourceIncludes };
+    }
+
+    /**
+     * Returns a string array of the excludes to be used when assembling/copying the jar.
+     *
+     * @return an array of tokens to exclude
+     */
+    private String[] getExcludes()
+    {
+        List excludeList = new ArrayList( FileUtils.getDefaultExcludesAsList() );
+
+        if ( jarSourceExcludes != null && !"".equals( jarSourceExcludes ) )
+        {
+            excludeList.add( jarSourceExcludes );
+        }
+
+        return (String[]) excludeList.toArray( EMPTY_STRING_ARRAY );
+    }
 }
diff --git a/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java
index 5a8e299..a0abd55 100644
--- a/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java
+++ b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java
@@ -14,207 +14,251 @@
  *   limitations under the License.
  *
  */
+
 package org.apache.felix.tools.maven.plugin;
 
+import java.util.HashMap;
 import java.util.Map;
-import java.util.Hashtable;
 
 /**
- * Created by IntelliJ IDEA.
- * User: tbennett
- * Date: Aug 12, 2005
- * Time: 4:03:29 PM
- * To change this template use File | Settings | File Templates.
+ * Hold values for an OSGi jar "bundle" manifest.
+ * 
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Apache Felix Project</a>
+ * @version $Rev$, $Date$
  */
-public class OsgiManifest {
+public class OsgiManifest
+{
     private String bundleActivator;
     private String bundleName;
     private String bundleDescription;
     private String bundleVendor;
-    //private String bundleVersion;
-    //private String bundleClassPath;
     private String bundleDate;
     private String bundleUpdateLocation;
     private String bundleSymbolicName;
-	private String bundleDocUrl;
-	private String bundleCategory;
-	private String exportService;
+    private String bundleDocUrl;
+    private String bundleCategory;
+    private String exportService;
     private String exportPackage;
     private String importPackage;
     private String metadataLocation;
-    private Hashtable entries = new Hashtable();
 
-    public Map getEntries() {
-        if (getBundleActivator() != null) {
-            entries.put("Bundle-Activator", getBundleActivator());
+    // private String bundleClasspath;
+
+    private Map entries = new HashMap();
+
+    public Map getEntries()
+    {
+        if ( getBundleActivator() != null )
+        {
+            entries.put( "Bundle-Activator", getBundleActivator() );
         }
-        if (getBundleName() != null) {
-            entries.put("Bundle-Name", getBundleName());
+
+        if ( getBundleName() != null )
+        {
+            entries.put( "Bundle-Name", getBundleName() );
         }
-        if (getBundleDescription() != null) {
-            entries.put("Bundle-Description", getBundleDescription());
+
+        if ( getBundleDescription() != null )
+        {
+            entries.put( "Bundle-Description", getBundleDescription() );
         }
-        if (getBundleVendor() != null) {
-            entries.put("Bundle-Vendor", getBundleVendor());
+
+        if ( getBundleVendor() != null )
+        {
+            entries.put( "Bundle-Vendor", getBundleVendor() );
         }
+
+        if ( getExportService() != null )
+        {
+            entries.put( "Export-Service", getExportService() );
+        }
+
+        if ( getExportPackage() != null )
+        {
+            entries.put( "Export-Package", getExportPackage() );
+        }
+
+        if ( getImportPackage() != null )
+        {
+            entries.put( "Import-Package", getImportPackage() );
+        }
+
         /*
-        if (getBundleVersion() != null) {
-            entries.put("Bundle-Version", getBundleVersion());
+         if (getBundleClassPath() != null) {
+         entries.put("Bundle-Classpath", getBundleClassPath());
+         }
+         */
+
+        if ( getBundleDate() != null )
+        {
+            entries.put( "Bundle-Date", getBundleDate() );
         }
-        */
-        if (getExportService() != null) {
-            entries.put("Export-Service", getExportService());
+
+        if ( getBundleUpdateLocation() != null )
+        {
+            entries.put( "Bundle-UpdateLocation", getBundleUpdateLocation() );
         }
-        if (getExportPackage() != null) {
-            entries.put("Export-Package", getExportPackage());
+
+        if ( getBundleSymbolicName() != null )
+        {
+            entries.put( "Bundle-SymbolicName", getBundleSymbolicName() );
         }
-        if (getImportPackage() != null) {
-            entries.put("Import-Package", getImportPackage());
+
+        if ( getMetadataLocation() != null )
+        {
+            entries.put( "Metadata-Location", getMetadataLocation() );
         }
-        /*
-        if (getBundleClassPath() != null) {
-            entries.put("Bundle-ClassPath", getBundleClassPath());
+
+        if ( getBundleCategory() != null )
+        {
+            entries.put( "Bundle-Category", getBundleCategory() );
         }
-        */
-        if (getBundleDate() != null) {
-            entries.put("Bundle-Date", getBundleDate());
+
+        if ( getBundleDocUrl() != null )
+        {
+            entries.put( "Bundle-DocUrl", getBundleDocUrl() );
         }
-        if (getBundleUpdateLocation() != null) {
-            entries.put("Bundle-UpdateLocation", getBundleUpdateLocation());
-        }
-        if (getBundleSymbolicName() != null) {
-            entries.put("Bundle-SymbolicName", getBundleSymbolicName());
-        }
-        if (getMetadataLocation() != null) {
-            entries.put("Metadata-Location", getMetadataLocation());
-        }
-		if (getBundleCategory() != null) {
-			entries.put("Bundle-Category", getBundleCategory());
-		}
-		if (getBundleDocUrl() != null) {
-			entries.put("Bundle-DocUrl", getBundleDocUrl());
-		}
-        return (Map) entries;
+
+        return entries;
     }
 
-    public String getBundleDocUrl() {
+    public String getBundleDocUrl()
+    {
         return bundleDocUrl;
     }
 
-    public void setBundleDocUrl(String bundleDocUrl) {
+    public void setBundleDocUrl( String bundleDocUrl )
+    {
         this.bundleDocUrl = bundleDocUrl;
     }
 
-    public String getBundleCategory() {
+    public String getBundleCategory()
+    {
         return bundleCategory;
     }
 
-    public void setBundleCategory(String bundleCategory) {
+    public void setBundleCategory( String bundleCategory )
+    {
         this.bundleCategory = bundleCategory;
     }
 
-    public String getBundleActivator() {
+    public String getBundleActivator()
+    {
         return bundleActivator;
     }
 
-    public void setBundleActivator(String bundleActivator) {
+    public void setBundleActivator( String bundleActivator )
+    {
         this.bundleActivator = bundleActivator;
     }
 
-    public String getBundleName() {
+    public String getBundleName()
+    {
         return bundleName;
     }
 
-    public void setBundleName(String bundleName) {
+    public void setBundleName( String bundleName )
+    {
         this.bundleName = bundleName;
     }
 
-    public String getBundleDescription() {
+    public String getBundleDescription()
+    {
         return bundleDescription;
     }
 
-    public void setBundleDescription(String bundleDescription) {
+    public void setBundleDescription( String bundleDescription )
+    {
         this.bundleDescription = bundleDescription;
     }
 
-    public String getBundleVendor() {
+    public String getBundleVendor()
+    {
         return bundleVendor;
     }
 
-    public void setBundleVendor(String bundleVendor) {
+    public void setBundleVendor( String bundleVendor )
+    {
         this.bundleVendor = bundleVendor;
     }
-/*
-    public String getBundleVersion() {
-        return bundleVersion;
-    }
 
-    public void setBundleVersion(String bundleVersion) {
-        this.bundleVersion = bundleVersion;
-    }
-*/
-    public String getExportService() {
+    public String getExportService()
+    {
         return exportService;
     }
 
-    public void setExportService(String exportService) {
+    public void setExportService( String exportService )
+    {
         this.exportService = exportService;
     }
 
-    public String getExportPackage() {
+    public String getExportPackage()
+    {
         return exportPackage;
     }
 
-    public void setExportPackage(String exportPackage) {
+    public void setExportPackage( String exportPackage )
+    {
         this.exportPackage = exportPackage;
     }
 
-    public String getImportPackage() {
+    public String getImportPackage()
+    {
         return importPackage;
     }
 
-    public void setImportPackage(String importPackage) {
+    public void setImportPackage( String importPackage )
+    {
         this.importPackage = importPackage;
     }
 
-/*
-    public String getBundleClassPath() {
-        return bundleClassPath;
-    }
+    /*
+     public String getBundleClasspath() {
+     return bundleClasspath;
+     }
 
-    public void setBundleClassPath(String bundleClassPath) {
-        this.bundleClassPath = bundleClassPath;
-    }
-*/
-    public String getBundleDate() {
+     public void setBundleClasspath(String bundleClasspath) {
+     this.bundleClasspath = bundleClasspath;
+     }
+     */
+
+    public String getBundleDate()
+    {
         return bundleDate;
     }
 
-    public void setBundleDate(String bundleDate) {
+    public void setBundleDate( String bundleDate )
+    {
         this.bundleDate = bundleDate;
     }
 
-    public String getBundleUpdateLocation() {
+    public String getBundleUpdateLocation()
+    {
         return bundleUpdateLocation;
     }
 
-    public void setBundleUpdateLocation(String bundleUpdateLocation) {
+    public void setBundleUpdateLocation( String bundleUpdateLocation )
+    {
         this.bundleUpdateLocation = bundleUpdateLocation;
     }
 
-    public String getBundleSymbolicName() {
+    public String getBundleSymbolicName()
+    {
         return bundleSymbolicName;
     }
 
-    public void setBundleSymbolicName(String bundleSymbolicName) {
+    public void setBundleSymbolicName( String bundleSymbolicName )
+    {
         this.bundleSymbolicName = bundleSymbolicName;
     }
 
-    public String getMetadataLocation() {
+    public String getMetadataLocation()
+    {
         return metadataLocation;
     }
 
-    public void setMetadataLocation(String metadataLocation) {
+    public void setMetadataLocation( String metadataLocation )
+    {
         this.metadataLocation = metadataLocation;
     }
 }
diff --git a/tools/maven2/maven-osgi-plugin/src/main/resources/META-INF/plexus/components.xml b/tools/maven2/maven-osgi-plugin/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..db3c912
--- /dev/null
+++ b/tools/maven2/maven-osgi-plugin/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,40 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+      <role-hint>osgi-bundle</role-hint>
+      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+      <configuration>
+        <lifecycles>
+          <lifecycle>
+            <id>default</id>
+            <!-- START SNIPPET: osgi-bundle-lifecycle -->
+            <phases>
+              <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
+              <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
+              <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+              <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
+              <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
+              <package>org.apache.maven.plugins:maven-osgi-plugin:osgi-bundle</package>
+              <install>org.apache.maven.plugins:maven-install-plugin:install</install>
+              <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
+            </phases>
+            <!-- END SNIPPET: osgi-bundle-lifecycle -->
+          </lifecycle>
+        </lifecycles>
+      </configuration>
+    </component>
+    <component>
+      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
+      <role-hint>osgi-bundle</role-hint>
+      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
+      <configuration>
+        <type>osgi-bundle</type>
+        <includesDependencies>true</includesDependencies>
+        <language>java</language>
+        <extension>jar</extension>
+        <addedToClasspath>true</addedToClasspath>
+      </configuration>
+    </component>
+  </components>
+</component-set>
