Index: src/test/java/org/apache/maven/plugin/eclipse/EclipseToMavenTest.java
===================================================================
--- src/test/java/org/apache/maven/plugin/eclipse/EclipseToMavenTest.java	(revision 1325242)
+++ src/test/java/org/apache/maven/plugin/eclipse/EclipseToMavenTest.java	(working copy)
@@ -1,20 +1,16 @@
 /*
- * 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.
+ * 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.maven.plugin.eclipse;
 
@@ -39,6 +35,7 @@
     /**
      * @see junit.framework.TestCase#setUp()
      */
+    @Override
     protected void setUp()
         throws Exception
     {
@@ -51,10 +48,9 @@
      */
     public void testParseDependencies()
     {
-        Dependency[] deps =
-            mojo.parseDependencies( "org.eclipse.ui;bundle-version=\"[3.2.0,4.0.0)\","
-                + "org.eclipse.ui.console;resolution:=\"optional\";bundle-version=\"[3.1.100,4.0.0)\",org.eclipse.help;"
-                + "bundle-version=\"[3.2.0,4.0.0)\",org.eclipse.core.expressions;bundle-version=\"[3.2.0,4.0.0)\"" );
+        Dependency[] deps = mojo.parseDependencies( "org.eclipse.ui;bundle-version=\"[3.2.0,4.0.0)\","
+            + "org.eclipse.ui.console;resolution:=\"optional\";bundle-version=\"[3.1.100,4.0.0)\",org.eclipse.help;"
+            + "bundle-version=\"[3.2.0,4.0.0)\",org.eclipse.core.expressions;bundle-version=\"[3.2.0,4.0.0)\"" );
 
         assertEquals( 4, deps.length );
         assertEquals( "org.eclipse", deps[0].getGroupId() );
@@ -83,8 +79,8 @@
      */
     public void testParseDependenciesWithQualifier()
     {
-        Dependency[] deps =
-            mojo.parseDependencies( "org.eclipse.ui;bundle-version=\"[3.2.0.0,4.0.0.0)\","
+        Dependency[] deps = mojo
+            .parseDependencies( "org.eclipse.ui;bundle-version=\"[3.2.0.0,4.0.0.0)\","
                 + "org.eclipse.ui.console;resolution:=\"optional\";bundle-version=\"[3.1.100.0,4.0.0.0)\",org.eclipse.help;"
                 + "bundle-version=\"[3.2.0.1,4.0.0.2)\",org.eclipse.core.expressions;bundle-version=\"[3.2.0.0,4.0.0.0)\"" );
 
@@ -113,6 +109,12 @@
         assertEquals( "org.eclipse", mojo.createGroupId( "org.eclipse.jdt" ) );
         assertEquals( "org.eclipse.jdt", mojo.createGroupId( "org.eclipse.jdt.apt" ) );
         assertEquals( "org.eclipse.jdt.apt", mojo.createGroupId( "org.eclipse.jdt.apt.core" ) );
+
+        assertEquals( "test", mojo.createGroupId( "test.source" ) );
+        assertEquals( "org", mojo.createGroupId( "org.eclipse.source" ) );
+        assertEquals( "org.eclipse", mojo.createGroupId( "org.eclipse.jdt.source" ) );
+        assertEquals( "org.eclipse.jdt", mojo.createGroupId( "org.eclipse.jdt.apt.source" ) );
+        assertEquals( "org.eclipse.jdt.apt", mojo.createGroupId( "org.eclipse.jdt.apt.core.source" ) );
     }
 
     /**
@@ -125,8 +127,29 @@
         assertEquals( "jdt", mojo.createArtifactId( "org.eclipse.jdt" ) );
         assertEquals( "apt", mojo.createArtifactId( "org.eclipse.jdt.apt" ) );
         assertEquals( "core", mojo.createArtifactId( "org.eclipse.jdt.apt.core" ) );
+
+        assertEquals( "test", mojo.createArtifactId( "test.source" ) );
+        assertEquals( "eclipse", mojo.createArtifactId( "org.eclipse.source" ) );
+        assertEquals( "jdt", mojo.createArtifactId( "org.eclipse.jdt.source" ) );
+        assertEquals( "apt", mojo.createArtifactId( "org.eclipse.jdt.apt.source" ) );
+        assertEquals( "core", mojo.createArtifactId( "org.eclipse.jdt.apt.core.source" ) );
     }
 
+    public void testCreateClassifier()
+    {
+        assertEquals( "", mojo.createClassifier( "test" ) );
+        assertEquals( "", mojo.createClassifier( "org.eclipse" ) );
+        assertEquals( "", mojo.createClassifier( "org.eclipse.jdt" ) );
+        assertEquals( "", mojo.createClassifier( "org.eclipse.jdt.apt" ) );
+        assertEquals( "", mojo.createClassifier( "org.eclipse.jdt.apt.core" ) );
+
+        assertEquals( "sources", mojo.createClassifier( "test.source" ) );
+        assertEquals( "sources", mojo.createClassifier( "org.eclipse.source" ) );
+        assertEquals( "sources", mojo.createClassifier( "org.eclipse.jdt.source" ) );
+        assertEquals( "sources", mojo.createClassifier( "org.eclipse.jdt.apt.source" ) );
+        assertEquals( "sources", mojo.createClassifier( "org.eclipse.jdt.apt.core.source" ) );
+    }
+
     public void testOsgiVersionToMavenVersion()
     {
         assertEquals( "1.2.3", mojo.osgiVersionToMavenVersion( "1.2.3", null, false ) );
Index: src/main/java/org/apache/maven/plugin/eclipse/EclipseToMavenMojo.java
===================================================================
--- src/main/java/org/apache/maven/plugin/eclipse/EclipseToMavenMojo.java	(revision 1325242)
+++ src/main/java/org/apache/maven/plugin/eclipse/EclipseToMavenMojo.java	(working copy)
@@ -82,6 +82,8 @@
     implements Contextualizable
 {
 
+    private static final String SOURCE_BUNDLE_SUFFIX = ".source"; //$NON-NLS-1$
+
     /**
      * A pattern the <code>deployTo</code> param should match.
      */
@@ -235,7 +237,16 @@
             String key = (String) it.next();
             EclipseOsgiPlugin plugin = (EclipseOsgiPlugin) plugins.get( key );
             Model model = (Model) models.get( key );
-            writeArtifact( plugin, model, remoteRepo );
+
+            String classifier = (String) model.getProperties().remove( "maven-eclipse-plugin.classifier" );
+            if ( "sources".equals( classifier ) )
+            {
+                writeSourceArtifact( plugin, model, remoteRepo );
+            }
+            else
+            {
+                writeArtifact( plugin, model, remoteRepo );
+            }
         }
     }
 
@@ -350,7 +361,7 @@
         throws MojoExecutionException
     {
 
-        String name, bundleName, version, groupId, artifactId, requireBundle;
+        String name, bundleName, version, groupId, artifactId, classifier, requireBundle;
 
         try
         {
@@ -390,6 +401,7 @@
 
         groupId = createGroupId( bundleName );
         artifactId = createArtifactId( bundleName );
+        classifier = createClassifier( bundleName );
 
         Model model = new Model();
         model.setModelVersion( "4.0.0" ); //$NON-NLS-1$
@@ -399,6 +411,7 @@
         model.setVersion( version );
 
         model.setProperties( plugin.getPomProperties() );
+        model.addProperty( "maven-eclipse-plugin.classifier", classifier ); //hack - can't set classifier on model
 
         if ( groupId.startsWith( "org.eclipse" ) ) //$NON-NLS-1$
         {
@@ -509,6 +522,53 @@
 
     }
 
+    /**
+     * Writes the source artifact to the repo
+     * 
+     * @param model
+     * @param remoteRepo remote repository (if set)
+     * @throws MojoExecutionException
+     */
+    private void writeSourceArtifact( EclipseOsgiPlugin plugin, Model model, ArtifactRepository remoteRepo )
+        throws MojoExecutionException
+    {
+        Artifact artifact = artifactFactory.createArtifactWithClassifier( model.getGroupId(), model.getArtifactId(),
+                                                                          model.getVersion(),
+                                                                          Constants.PROJECT_PACKAGING_JAR, "sources" ); 
+
+        try
+        {
+            File jarFile = plugin.getJarFile();
+
+            if ( remoteRepo != null )
+            {
+                deployer.deploy( jarFile, artifact, remoteRepo, localRepository );
+            }
+            else
+            {
+                installer.install( jarFile, artifact, localRepository );
+            }
+        }
+        catch ( ArtifactDeploymentException e )
+        {
+            throw new MojoExecutionException(
+                                              Messages.getString( "EclipseToMavenMojo.errordeployartifacttorepository" ), e ); //$NON-NLS-1$
+        }
+        catch ( ArtifactInstallationException e )
+        {
+            throw new MojoExecutionException(
+                                              Messages
+                                                  .getString( "EclipseToMavenMojo.errorinstallartifacttorepository" ), e ); //$NON-NLS-1$
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException(
+                                              Messages
+                                                  .getString( "EclipseToMavenMojo.errorgettingjarfileforplugin", plugin ), e ); //$NON-NLS-1$
+        }
+
+    }
+
     protected String osgiVersionToMavenVersion( String version )
     {
         return osgiVersionToMavenVersion( version, null, stripQualifier );
@@ -599,6 +659,33 @@
     }
 
     /**
+     * Check if the provided bundle name is a source bundle, i.e. if it ends with {@link #SOURCE_BUNDLE_SUFFIX }
+     * 
+     * @param bundleName the bundle name to check
+     * @return true if it is a source bundle, false otherwise
+     */
+    protected boolean isSourceBundle( String bundleName )
+    {
+        return bundleName.endsWith( SOURCE_BUNDLE_SUFFIX );
+    }
+
+    /**
+     * Remove the source bundle suffix from a bundle name, if and only if it is a source bundle (as defined by {@link #isSourceBundle(String)}
+     * 
+     * @param bundleName the bundle name to trim
+     * @return the trimmed bundle name, or the original bundle name if not a source bundle
+     */
+    protected String removeSourceSuffix( String bundleName )
+    {
+        if ( isSourceBundle( bundleName ) )
+        {
+            int trimmedLength = bundleName.length() - SOURCE_BUNDLE_SUFFIX.length();
+            return bundleName.substring( 0, trimmedLength );
+        }
+        return bundleName;
+    }
+
+    /**
      * Get the group id as the tokens until last dot e.g. <code>org.eclipse.jdt</code> -> <code>org.eclipse</code>
      * 
      * @param bundleName bundle name
@@ -606,6 +693,7 @@
      */
     protected String createGroupId( String bundleName )
     {
+        bundleName = removeSourceSuffix( bundleName );
         int i = bundleName.lastIndexOf( '.' ); //$NON-NLS-1$
         if ( i > 0 )
         {
@@ -623,6 +711,7 @@
      */
     protected String createArtifactId( String bundleName )
     {
+        bundleName = removeSourceSuffix( bundleName );
         int i = bundleName.lastIndexOf( '.' ); //$NON-NLS-1$
         if ( i > 0 )
         {
@@ -632,6 +721,11 @@
             return bundleName;
     }
 
+    protected String createClassifier( String bundleName )
+    {
+        return isSourceBundle( bundleName ) ? "sources" : ""; //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
     /**
      * Parses the "Require-Bundle" and convert it to a list of dependencies.
      * 
@@ -672,6 +766,7 @@
             Dependency dep = new Dependency();
             dep.setGroupId( createGroupId( bundleName ) );
             dep.setArtifactId( createArtifactId( bundleName ) );
+            dep.setClassifier( createClassifier( bundleName ) );
             dep.setVersion( version );
             dep.setOptional( optional );
 
