diff --git a/src/it/projects/repositories/basic-repository/pom.xml b/src/it/projects/repositories/basic-repository/pom.xml
index a20dbd7..53328fb 100644
--- a/src/it/projects/repositories/basic-repository/pom.xml
+++ b/src/it/projects/repositories/basic-repository/pom.xml
@@ -45,7 +45,9 @@
       <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <configuration>
-          <descriptor>src/assemble/bin.xml</descriptor>
+          <descriptors>
+            <descriptor>src/assemble/bin.xml</descriptor>
+          </descriptors>
           <finalName>assembly</finalName>        
         </configuration>
 
diff --git a/src/main/java/org/apache/maven/plugins/assembly/AssemblerConfigurationSource.java b/src/main/java/org/apache/maven/plugins/assembly/AssemblerConfigurationSource.java
index 03cad62..bcbd02a 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/AssemblerConfigurationSource.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/AssemblerConfigurationSource.java
@@ -35,12 +35,6 @@
  */
 public interface AssemblerConfigurationSource
 {
-
-    /**
-     * @return The descriptor.
-     */
-    String getDescriptor();
-
     /**
      * @return The descriptors.
      */
diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java b/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java
index 2dfe932..9d4d11a 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java
@@ -103,17 +103,10 @@
 
         final List<Assembly> assemblies = new ArrayList<Assembly>();
 
-        final String descriptor = configSource.getDescriptor();
         final String[] descriptors = configSource.getDescriptors();
         final String[] descriptorRefs = configSource.getDescriptorReferences();
         final File descriptorSourceDirectory = configSource.getDescriptorSourceDirectory();
 
-        if ( descriptor != null )
-        {
-            locator.setStrategies( strategies );
-            addAssemblyFromDescriptor( descriptor, locator, configSource, assemblies );
-        }
-
         if ( ( descriptors != null ) && ( descriptors.length > 0 ) )
         {
             locator.setStrategies( strategies );
diff --git a/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java b/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java
index 3c11a13..b1392a1 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java
@@ -194,15 +194,6 @@
     private File archiveBaseDirectory;
 
     /**
-     * Assembly XML Descriptor file. This must be the path to your customized descriptor file.
-     *
-     * @deprecated Please use descriptors instead
-     */
-    @Deprecated
-    @Parameter( property = "descriptor" )
-    private String descriptor;
-
-    /**
      * Sets the TarArchiver behavior on file paths with more than 100 characters length. Valid values are: "warn"
      * (default), "fail", "truncate", "gnu", "posix", "posix_warn" or "omit".
      */
@@ -629,18 +620,6 @@
         this.basedir = basedir;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * @deprecated This has been replaced by {@link #getDescriptors()}
-     */
-    @Override
-    @Deprecated
-    public String getDescriptor()
-    {
-        return descriptor;
-    }
-
     @Override
     public String[] getDescriptorReferences()
     {
diff --git a/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java b/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java
index c5f2d46..64f962a 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java
@@ -19,10 +19,15 @@
  * under the License.
  */
 
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 /**
  * Assemble an application bundle or distribution from an assembly descriptor. This goal is suitable either for binding
@@ -38,6 +43,36 @@
 public class SingleAssemblyMojo
     extends AbstractAssemblyMojo
 {
+    @Parameter( defaultValue = "${plugin}", readonly = true )
+    private PluginDescriptor plugin;
+
+    @Override
+    public void execute()
+        throws MojoExecutionException, MojoFailureException
+    {
+        verifyRemovedParameter( "classifier" );
+        verifyRemovedParameter( "descriptor" );
+        verifyRemovedParameter( "descriptorId" );
+        verifyRemovedParameter( "includeSite" );
+        
+        super.execute();
+    }
+    
+    private void verifyRemovedParameter( String paramName )
+    {
+        Object pluginConfiguration = plugin.getPlugin().getConfiguration();
+        if ( pluginConfiguration instanceof Xpp3Dom )
+        {
+            Xpp3Dom configDom = (Xpp3Dom) pluginConfiguration;
+            
+            if ( configDom.getChild( paramName ) != null )
+            {
+                throw new IllegalArgumentException( "parameter '" + paramName
+                    + "' has been removed from the plugin, please verify documentation." );
+            }
+        }
+    }
+    
     /**
      */
     @Parameter( defaultValue = "${project}", readonly = true, required = true )
diff --git a/src/test/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReaderTest.java b/src/test/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReaderTest.java
index e4377aa..8acff00 100644
--- a/src/test/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReaderTest.java
+++ b/src/test/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReaderTest.java
@@ -825,7 +825,7 @@
 
         final String assemblyFile = files.get( 0 );
 
-        final List<Assembly> assemblies = performReadAssemblies( basedir, assemblyFile, null, null, null );
+        final List<Assembly> assemblies = performReadAssemblies( basedir, new String[] { assemblyFile }, null, null );
 
         assertNotNull( assemblies );
         assertEquals( 1, assemblies.size() );
@@ -845,7 +845,7 @@
 
         try
         {
-            performReadAssemblies( basedir, assemblyFile.getAbsolutePath(), null, null, null, false );
+            performReadAssemblies( basedir, null, null, null, false );
 
             fail( "Should fail when descriptor file is missing and ignoreDescriptors == false" );
         }
@@ -865,7 +865,7 @@
 
         try
         {
-            performReadAssemblies( basedir, assemblyFile.getAbsolutePath(), null, null, null, true );
+            performReadAssemblies( basedir, null, null, null, true );
         }
         catch ( final AssemblyReadException e )
         {
@@ -892,7 +892,7 @@
         final List<String> files = writeAssembliesToFile( assemblies, basedir );
 
         final List<Assembly> results =
-            performReadAssemblies( basedir, null, files.toArray( new String[files.size()] ), null, null );
+            performReadAssemblies( basedir, files.toArray( new String[files.size()] ), null, null );
 
         assertNotNull( results );
         assertEquals( 2, results.size() );
@@ -912,7 +912,7 @@
         final File basedir = fileManager.createTempDir();
 
         final List<Assembly> assemblies =
-            performReadAssemblies( basedir, null, null, new String[]{ "bin", "src" }, null );
+            performReadAssemblies( basedir, null, new String[]{ "bin", "src" }, null );
 
         assertNotNull( assemblies );
         assertEquals( 2, assemblies.size() );
@@ -943,7 +943,7 @@
 
         writeAssembliesToFile( assemblies, basedir );
 
-        final List<Assembly> results = performReadAssemblies( basedir, null, null, null, basedir );
+        final List<Assembly> results = performReadAssemblies( basedir, null, null, basedir );
 
         assertNotNull( results );
         assertEquals( 2, results.size() );
@@ -976,7 +976,7 @@
 
         fileManager.createFile( basedir, "readme.txt", "This is just a readme file, not a descriptor." );
 
-        final List<Assembly> results = performReadAssemblies( basedir, null, null, null, basedir );
+        final List<Assembly> results = performReadAssemblies( basedir, null, null, basedir );
 
         assertNotNull( results );
         assertEquals( 2, results.size() );
@@ -1018,21 +1018,18 @@
         return files;
     }
 
-    private List<Assembly> performReadAssemblies( final File basedir, final String descriptor,
-                                                  final String[] descriptors, final String[] descriptorRefs,
-                                                  final File descriptorDir )
+    private List<Assembly> performReadAssemblies( final File basedir, final String[] descriptors,
+                                                  final String[] descriptorRefs, final File descriptorDir )
         throws AssemblyReadException, InvalidAssemblerConfigurationException
     {
-        return performReadAssemblies( basedir, descriptor, descriptors, descriptorRefs, descriptorDir, false );
+        return performReadAssemblies( basedir, descriptors, descriptorRefs, descriptorDir, false );
     }
 
-    private List<Assembly> performReadAssemblies( final File basedir, final String descriptor,
-                                                  final String[] descriptors, final String[] descriptorRefs,
-                                                  final File descriptorDir, final boolean ignoreMissing )
+    private List<Assembly> performReadAssemblies( final File basedir, final String[] descriptors,
+                                                  final String[] descriptorRefs, final File descriptorDir,
+                                                  final boolean ignoreMissing )
         throws AssemblyReadException, InvalidAssemblerConfigurationException
     {
-        expect( configSource.getDescriptor() ).andReturn( descriptor );
-
         expect( configSource.getDescriptorReferences() ).andReturn( descriptorRefs );
 
         expect( configSource.getDescriptors() ).andReturn( descriptors );
