Index: maven-plugin-tools/maven-plugin-tools-java/src/test/java/org/apache/maven/tools/plugin/extractor/java/JavaMojoDescriptorExtractorTest.java
===================================================================
--- maven-plugin-tools/maven-plugin-tools-java/src/test/java/org/apache/maven/tools/plugin/extractor/java/JavaMojoDescriptorExtractorTest.java	(revision 405803)
+++ maven-plugin-tools/maven-plugin-tools-java/src/test/java/org/apache/maven/tools/plugin/extractor/java/JavaMojoDescriptorExtractorTest.java	(working copy)
@@ -20,11 +20,15 @@
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.apache.maven.plugin.descriptor.Parameter;
 
 import java.io.File;
 import java.net.URL;
 import java.util.List;
 
+import source2.sub.MyBla;
+
 /**
  * @author jdcasey
  */
@@ -56,6 +60,40 @@
         assertEquals( 2, results.size() );
     }
 
+    public void testShouldPropagateImplementationParameter()
+        throws Exception
+    {
+        JavaMojoDescriptorExtractor extractor = new JavaMojoDescriptorExtractor();
+
+        File sourceFile = fileOf( "dir-flag.txt" );
+        System.out.println( "found source file: " + sourceFile );
+
+        File dir = sourceFile.getParentFile();
+
+        Model model = new Model();
+        model.setArtifactId( "maven-unitTesting-plugin" );
+
+        MavenProject project = new MavenProject( model );
+
+        project.setFile( new File( dir, "pom.xml" ) );
+        project.addCompileSourceRoot( new File( dir, "source2" ).getPath() );
+
+        PluginDescriptor pluginDescriptor = new PluginDescriptor();
+        pluginDescriptor.setGoalPrefix( "test" );
+        List results = extractor.execute( project, pluginDescriptor );
+        assertEquals( 1, results.size() );
+
+        MojoDescriptor mojoDescriptor = (MojoDescriptor) results.get( 0 );
+
+        List parameters = mojoDescriptor.getParameters();
+
+        assertEquals( 1, parameters.size() );
+
+        Parameter parameter = (Parameter) parameters.get( 0 );
+
+        assertEquals( MyBla.class.getName(), parameter.getImplementation() );
+    }
+
     private File fileOf( String classpathResource )
     {
         ClassLoader cl = Thread.currentThread().getContextClassLoader();
Index: maven-plugin-tools/maven-plugin-tools-java/src/main/java/org/apache/maven/tools/plugin/extractor/java/JavaMojoDescriptorExtractor.java
===================================================================
--- maven-plugin-tools/maven-plugin-tools-java/src/main/java/org/apache/maven/tools/plugin/extractor/java/JavaMojoDescriptorExtractor.java	(revision 405803)
+++ maven-plugin-tools/maven-plugin-tools-java/src/main/java/org/apache/maven/tools/plugin/extractor/java/JavaMojoDescriptorExtractor.java	(working copy)
@@ -60,6 +60,11 @@
     public static final String PARAMETER_DEFAULT_VALUE = "default-value";
 
     /**
+     * This defines the default implementation in the case the parameter type is an interface.
+     */
+    public static final String PARAMETER_IMPLEMENTATION = "implementation";
+
+    /**
      * This indicates the base name of the bean properties used to read/write this parameter's value.
      * So:
      *
@@ -422,6 +427,8 @@
                 }
 
                 pd.setDefaultValue( parameter.getNamedParameter( PARAMETER_DEFAULT_VALUE ) );
+
+                pd.setImplementation( parameter.getNamedParameter( PARAMETER_IMPLEMENTATION ) );
             }
 
             mojoDescriptor.addParameter( pd );
Index: maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
===================================================================
--- maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java	(revision 405803)
+++ maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java	(working copy)
@@ -909,6 +909,11 @@
                     }
                 }
 
+                if ( result.getAttribute( "implementation" ) == null  && parameter.getImplementation() != null )
+                {
+                    result.setAttribute( "implementation", parameter.getImplementation() ); 
+                }
+
                 if ( !addedPomConfig && mojoConfig != null )
                 {
                     result.addChild( copyConfiguration( mojoConfig ) );
Index: maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/Parameter.java
===================================================================
--- maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/Parameter.java	(revision 405803)
+++ maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/Parameter.java	(working copy)
@@ -40,6 +40,8 @@
 
     private String defaultValue;
 
+    private String implementation;
+
     private Requirement requirement;
 
     // ----------------------------------------------------------------------
@@ -160,4 +162,14 @@
     {
         this.requirement = requirement;
     }
+
+    public String getImplementation()
+    {
+        return implementation;
+    }
+
+    public void setImplementation( String implementation )
+    {
+        this.implementation = implementation;
+    }
 }
Index: maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
===================================================================
--- maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java	(revision 405803)
+++ maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java	(working copy)
@@ -250,6 +250,8 @@
 
             parameter.setDeprecated( d.getChild( "deprecated" ).getValue() );
 
+            parameter.setImplementation( d.getChild( "implementation" ).getValue() );
+
             parameters.add( parameter );
         }
 

