diff --git a/tools/maven2/osgi-plugin/pom.xml b/tools/maven2/osgi-plugin/pom.xml
new file mode 100644
index 0000000..f8c4f4c
--- /dev/null
+++ b/tools/maven2/osgi-plugin/pom.xml
@@ -0,0 +1,45 @@
+<project>
+  <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</version>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+      <version>2.0-alpha-3</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-archiver</artifactId>
+        <version>2.0-alpha-3</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-project</artifactId>
+        <version>2.0-alpha-3</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-archiver</artifactId>
+        <version>2.0-alpha-3</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-project</artifactId>
+        <version>2.0-alpha-3</version>
+    </dependency>
+      <dependency>
+          <groupId>plexus</groupId>
+          <artifactId>plexus-archiver</artifactId>
+          <version>1.0-alpha-1</version>
+      </dependency>
+      <dependency>
+        <groupId>plexus</groupId>
+        <artifactId>plexus-utils</artifactId>
+        <version>1.0-alpha-3</version>
+      </dependency>
+  </dependencies>
+</project>
diff --git a/tools/maven2/osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java b/tools/maven2/osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java
new file mode 100644
index 0000000..15580d3
--- /dev/null
+++ b/tools/maven2/osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java
@@ -0,0 +1,177 @@
+package org.apache.felix.tools.maven.plugin;
+
+/*
+ * Copyright 2001-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
+ *
+ *      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.
+ */
+
+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.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="tbennett@apache.org">Timothy Bennett</a>
+ * @goal felix-jar
+ * @phase package
+ * @requiresDependencyResolution runtime
+ * @description build a 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[]{"**/**"};
+
+    /**
+     * @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;
+
+    /**
+     * @parameter expression="${project}"
+     * @required
+     * @readonly
+     */
+    private MavenProject project;
+
+    /**
+     * @parameter
+     */
+    private String manifestFile;
+
+    /**
+     * @parameter expression="${org.apache.felix.tools.maven.plugin.OsgiManifest}"
+     */
+    private OsgiManifest osgiManifest;
+
+    /**
+     * @parameter
+     */
+    private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+
+    /**
+     * @todo Add license files in META-INF directory.
+     */
+    public void execute() throws MojoExecutionException {
+        File jarFile = new File(basedir, finalName + ".jar");
+
+        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?
+
+            For now... I'm going to disable support for file-based manifest entries.
+        */
+        //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.");
+        //}
+
+        // 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) {
+            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");
+        }
+
+        /*
+            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.
+        */
+        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())) {
+                String type = artifact.getType();
+                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);
+                    }
+                }
+            }
+        }
+        if (bundleClasspath.length() != 0) {
+            archive.addManifestEntry("Bundle-ClassPath", bundleClasspath.toString());
+        }
+        bundleClasspath = null;
+
+        // 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);
+        }
+    }
+}
diff --git a/tools/maven2/osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java b/tools/maven2/osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java
new file mode 100644
index 0000000..e317fe4
--- /dev/null
+++ b/tools/maven2/osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java
@@ -0,0 +1,141 @@
+package org.apache.felix.tools.maven.plugin;
+
+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.
+ */
+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 exportPackage;
+    private String metadataLocation;
+    private Hashtable entries = new Hashtable();
+
+    public Map getEntries() {
+        if (getBundleActivator() != null) {
+            entries.put("Bundle-Activator", getBundleActivator());
+        }
+        if (getBundleName() != null) {
+            entries.put("Bundle-Name", getBundleName());
+        }
+        if (getBundleDescription() != null) {
+            entries.put("Bundle-Description", getBundleDescription());
+        }
+        if (getBundleVendor() != null) {
+            entries.put("Bundle-Vendor", getBundleVendor());
+        }
+        if (getBundleVersion() != null) {
+            entries.put("Bundle-Version", getBundleVersion());
+        }
+        if (getExportPackage() != null) {
+            entries.put("Export-Package", getExportPackage());
+        }
+        /*
+        if (getBundleClassPath() != null) {
+            entries.put("Bundle-ClassPath", getBundleClassPath());
+        }
+        */
+        if (getBundleDate() != null) {
+            entries.put("Bundle-Date", getBundleDate());
+        }
+        if (getBundleUpdateLocation() != null) {
+            entries.put("Bundle-UpdateLocation", getBundleUpdateLocation());
+        }
+        if (getMetadataLocation() != null) {
+            entries.put("Metadata-Location", getMetadataLocation());
+        }
+        return (Map) entries;
+    }
+
+    public String getBundleActivator() {
+        return bundleActivator;
+    }
+
+    public void setBundleActivator(String bundleActivator) {
+        this.bundleActivator = bundleActivator;
+    }
+
+    public String getBundleName() {
+        return bundleName;
+    }
+
+    public void setBundleName(String bundleName) {
+        this.bundleName = bundleName;
+    }
+
+    public String getBundleDescription() {
+        return bundleDescription;
+    }
+
+    public void setBundleDescription(String bundleDescription) {
+        this.bundleDescription = bundleDescription;
+    }
+
+    public String getBundleVendor() {
+        return bundleVendor;
+    }
+
+    public void setBundleVendor(String bundleVendor) {
+        this.bundleVendor = bundleVendor;
+    }
+
+    public String getBundleVersion() {
+        return bundleVersion;
+    }
+
+    public void setBundleVersion(String bundleVersion) {
+        this.bundleVersion = bundleVersion;
+    }
+
+    public String getExportPackage() {
+        return exportPackage;
+    }
+
+    public void setExportPackage(String exportPackage) {
+        this.exportPackage = exportPackage;
+    }
+/*
+    public String getBundleClassPath() {
+        return bundleClassPath;
+    }
+
+    public void setBundleClassPath(String bundleClassPath) {
+        this.bundleClassPath = bundleClassPath;
+    }
+*/
+    public String getBundleDate() {
+        return bundleDate;
+    }
+
+    public void setBundleDate(String bundleDate) {
+        this.bundleDate = bundleDate;
+    }
+
+    public String getBundleUpdateLocation() {
+        return bundleUpdateLocation;
+    }
+
+    public void setBundleUpdateLocation(String bundleUpdateLocation) {
+        this.bundleUpdateLocation = bundleUpdateLocation;
+    }
+
+    public String getMetadataLocation() {
+        return metadataLocation;
+    }
+
+    public void setMetadataLocation(String metadataLocation) {
+        this.metadataLocation = metadataLocation;
+    }
+}
