diff --git a/src/main/java/org/apache/maven/plugins/war/WarManifestMojo.java b/src/main/java/org/apache/maven/plugins/war/WarManifestMojo.java
deleted file mode 100644
index 7d1901b..0000000
--- a/src/main/java/org/apache/maven/plugins/war/WarManifestMojo.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.apache.maven.plugins.war;
-
-/*
- * 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.
- */
-
-import org.apache.maven.archiver.MavenArchiver;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.codehaus.plexus.archiver.Archiver;
-import org.codehaus.plexus.archiver.jar.Manifest;
-import org.codehaus.plexus.archiver.jar.ManifestException;
-import org.codehaus.plexus.archiver.war.WarArchiver;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.WriterFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-/**
- * Generate a manifest for this webapp. The manifest file is created in the <code>warSourceDirectory</code>.
- *
- * @author Mike Perham
- * @version $Id$
- */
-// CHECKSTYLE_OFF: LineLength
-@Mojo( name = "manifest", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, threadSafe = true, requiresDependencyResolution = ResolutionScope.RUNTIME )
-// CHECKSTYLE_ON: LineLength
-public class WarManifestMojo
-    extends AbstractWarMojo
-{
-    /**
-     * The WAR archiver.
-     */
-    @Component( role = Archiver.class, hint = "war" )
-    private WarArchiver warArchiver;
-
-    /**
-     * Executes this mojo on the current project.
-     *
-     * @throws MojoExecutionException if an error occurred while building the webapp
-     */
-    public void execute()
-        throws MojoExecutionException
-    {
-        File manifestDir = new File( getWarSourceDirectory(), "META-INF" );
-        if ( !manifestDir.exists() )
-        {
-            manifestDir.mkdirs();
-        }
-        File manifestFile = new File( manifestDir, "MANIFEST.MF" );
-        MavenArchiver ma = new MavenArchiver();
-        ma.setArchiver( warArchiver );
-        ma.setOutputFile( manifestFile );
-
-        PrintWriter printWriter = null;
-        try
-        {
-            Manifest mf = ma.getManifest( getSession(), getProject(), getArchive() );
-            printWriter = new PrintWriter( WriterFactory.newWriter( manifestFile, WriterFactory.UTF_8 ) );
-            mf.write( printWriter );
-            printWriter.close();
-            printWriter = null;
-        }
-        catch ( ManifestException e )
-        {
-            throw new MojoExecutionException( "Error preparing the manifest: " + e.getMessage(), e );
-        }
-        catch ( DependencyResolutionRequiredException e )
-        {
-            throw new MojoExecutionException( "Error preparing the manifest: " + e.getMessage(), e );
-        }
-        catch ( IOException e )
-        {
-            throw new MojoExecutionException( "Error preparing the manifest: " + e.getMessage(), e );
-        }
-        finally
-        {
-            IOUtil.close( printWriter );
-        }
-    }
-}
diff --git a/src/test/java/org/apache/maven/plugins/war/WarManifestMojoTest.java b/src/test/java/org/apache/maven/plugins/war/WarManifestMojoTest.java
deleted file mode 100644
index 7e04c07..0000000
--- a/src/test/java/org/apache/maven/plugins/war/WarManifestMojoTest.java
+++ /dev/null
@@ -1,194 +0,0 @@
-package org.apache.maven.plugins.war;
-
-/*
- * 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.
- */
-
-import java.io.File;
-
-import org.apache.maven.archiver.MavenArchiveConfiguration;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.DefaultArtifact;
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
-import org.codehaus.plexus.util.FileUtils;
-
-/**
- * @author Allan Ramirez
- */
-public class WarManifestMojoTest
-    extends AbstractMojoTestCase
-{
-    File testPom;
-
-    WarManifestMojo mojo;
-
-    public void testEnvironment()
-        throws Exception
-    {
-        loadMojo( "target/test-classes/unit/manifest/basic-manifest-test/plugin-config.xml" );
-    }
-
-    public void testBasicManifest()
-        throws Exception
-    {
-        loadMojo( "target/test-classes/unit/manifest/basic-manifest-test/plugin-config.xml" );
-
-        mojo.execute();
-
-        File warSourceDir = (File) getVariableValueFromObject( mojo, "warSourceDirectory" );
-
-        File manifestDir = new File( warSourceDir, "META-INF" );
-
-        File manifest = new File( manifestDir, "MANIFEST.MF" );
-
-        assertTrue( manifest.exists() );
-    }
-
-    public void testManifestWithClasspath()
-        throws Exception
-    {
-        loadMojo( "target/test-classes/unit/manifest/manifest-with-classpath/plugin-config.xml" );
-
-        MavenArchiveConfiguration config = (MavenArchiveConfiguration) getVariableValueFromObject( mojo, "archive" );
-
-        mojo.execute();
-
-        assertTrue( config.getManifest().isAddClasspath() );
-
-        File warSourceDir = (File) getVariableValueFromObject( mojo, "warSourceDirectory" );
-
-        File manifestDir = new File( warSourceDir, "META-INF" );
-
-        File manifest = new File( manifestDir, "MANIFEST.MF" );
-
-        assertTrue( manifest.exists() );
-
-        String content = FileUtils.fileRead( manifest );
-
-        int idx = content.indexOf( "Class-Path" );
-
-        assertTrue( idx >= 0 );
-    }
-
-    public void testManifestWithMainClass()
-        throws Exception
-    {
-        loadMojo( "target/test-classes/unit/manifest/manifest-with-main-class/plugin-config.xml" );
-
-        MavenArchiveConfiguration config = (MavenArchiveConfiguration) getVariableValueFromObject( mojo, "archive" );
-
-        mojo.execute();
-
-        assertEquals( "org.dummy.test.SomeClass", config.getManifest().getMainClass() );
-
-        File warSourceDir = (File) getVariableValueFromObject( mojo, "warSourceDirectory" );
-
-        File manifestDir = new File( warSourceDir, "META-INF" );
-
-        File manifest = new File( manifestDir, "MANIFEST.MF" );
-
-        assertTrue( manifest.exists() );
-
-        String content = FileUtils.fileRead( manifest );
-
-        int idx = content.indexOf( "Main-Class" );
-
-        assertTrue( idx >= 0 );
-    }
-
-    public void testManifestWithOtherAttributes()
-        throws Exception
-    {
-        loadMojo( "target/test-classes/unit/manifest/manifest-with-other-attrs/plugin-config.xml" );
-
-        MavenArchiveConfiguration config = (MavenArchiveConfiguration) getVariableValueFromObject( mojo, "archive" );
-
-        DefaultArtifact da = new DefaultArtifact( "org.apache.test", "xyz", "2.0.0", Artifact.SCOPE_COMPILE, "jar", "", null );
-        mojo.getProject().setArtifact( da );
-
-        mojo.execute();
-
-        assertTrue( config.getManifest().isAddExtensions() );
-
-        File warSourceDir = (File) getVariableValueFromObject( mojo, "warSourceDirectory" );
-
-        File manifestDir = new File( warSourceDir, "META-INF" );
-
-        File manifest = new File( manifestDir, "MANIFEST.MF" );
-
-        assertTrue( manifest.exists() );
-
-        String content = FileUtils.fileRead( manifest );
-
-        int idx = content.indexOf( "Specification-Title" );
-
-        assertTrue( idx >= 0 );
-
-        idx = content.indexOf( "Specification-Vendor" );
-
-        assertTrue( idx >= 0 );
-
-        idx = content.indexOf( "Implementation-Vendor" );
-
-        assertTrue( idx >= 0 );
-    }
-
-    public void testManifestWithCustomAttributes()
-        throws Exception
-    {
-        loadMojo( "target/test-classes/unit/manifest/manifest-with-custom-attrs/plugin-config.xml" );
-
-        DefaultArtifact da = new DefaultArtifact( "org.apache.test", "xyz", "2.0.0", Artifact.SCOPE_COMPILE, "jar", "", null );
-        mojo.getProject().setArtifact( da );
-        
-        MavenArchiveConfiguration config = (MavenArchiveConfiguration) getVariableValueFromObject( mojo, "archive" );
-        
-        mojo.execute();
-
-        assertTrue( config.getManifest().isAddExtensions() );
-
-        File warSourceDir = (File) getVariableValueFromObject( mojo, "warSourceDirectory" );
-
-        File manifestDir = new File( warSourceDir, "META-INF" );
-
-        File manifest = new File( manifestDir, "MANIFEST.MF" );
-
-        assertTrue( manifest.exists() );
-
-        String content = FileUtils.fileRead( manifest );
-
-        int idx = content.indexOf( "Specification-Title" );
-
-        assertTrue( idx >= 0 );
-
-        idx = content.indexOf( "Custom-Version" );
-
-        assertTrue( idx >= 0 );
-
-    }
-
-    public void loadMojo( String pluginXml )
-        throws Exception
-    {
-        testPom = new File( getBasedir(), pluginXml );
-
-        mojo = (WarManifestMojo) lookupMojo( "manifest", testPom );
-
-        assertNotNull( mojo );
-    }
-}
diff --git a/src/test/resources/unit/manifest/basic-manifest-test/plugin-config.xml b/src/test/resources/unit/manifest/basic-manifest-test/plugin-config.xml
deleted file mode 100644
index 4c99b21..0000000
--- a/src/test/resources/unit/manifest/basic-manifest-test/plugin-config.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-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.
--->
-
-<project>
-  <name>war-plugin-test</name>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-war-plugin</artifactId>
-        <configuration>
-          <project implementation="org.apache.maven.plugins.war.stub.MavenProjectBasicStub" />
-          <warSourceDirectory>${basedir}/target/test-classes/unit/manifest/basic-manifest-test/src/main</warSourceDirectory>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/src/test/resources/unit/manifest/manifest-with-classpath/plugin-config.xml b/src/test/resources/unit/manifest/manifest-with-classpath/plugin-config.xml
deleted file mode 100644
index fd94630..0000000
--- a/src/test/resources/unit/manifest/manifest-with-classpath/plugin-config.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-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.
--->
-
-<project>
-  <name>war-plugin-test</name>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-war-plugin</artifactId>
-        <configuration>
-          <project implementation="org.apache.maven.plugins.war.stub.MavenProjectArtifactsStub"/>
-          <warSourceDirectory>
-            ${basedir}/target/test-classes/unit/manifest/manifest-with-classpath/src/main</warSourceDirectory>
-          <archive>
-            <manifest>
-              <addClasspath>true</addClasspath>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/src/test/resources/unit/manifest/manifest-with-classpath/sample-artifacts/maven-artifact1-1.0-SNAPSHOT.jar b/src/test/resources/unit/manifest/manifest-with-classpath/sample-artifacts/maven-artifact1-1.0-SNAPSHOT.jar
deleted file mode 100644
index e69de29..0000000
--- a/src/test/resources/unit/manifest/manifest-with-classpath/sample-artifacts/maven-artifact1-1.0-SNAPSHOT.jar
+++ /dev/null
diff --git a/src/test/resources/unit/manifest/manifest-with-classpath/sample-artifacts/maven-artifact2-1.0-SNAPSHOT.jar b/src/test/resources/unit/manifest/manifest-with-classpath/sample-artifacts/maven-artifact2-1.0-SNAPSHOT.jar
deleted file mode 100644
index e69de29..0000000
--- a/src/test/resources/unit/manifest/manifest-with-classpath/sample-artifacts/maven-artifact2-1.0-SNAPSHOT.jar
+++ /dev/null
diff --git a/src/test/resources/unit/manifest/manifest-with-custom-attrs/plugin-config.xml b/src/test/resources/unit/manifest/manifest-with-custom-attrs/plugin-config.xml
deleted file mode 100644
index 60bc2d9..0000000
--- a/src/test/resources/unit/manifest/manifest-with-custom-attrs/plugin-config.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-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.
--->
-
-<project>
-  <name>war-plugin-test</name>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-war-plugin</artifactId>
-        <configuration>
-          <project implementation="org.apache.maven.plugins.war.stub.MavenProjectBasicStub"/>
-          <warSourceDirectory>
-            ${basedir}/target/test-classes/unit/manifest/manifest-with-custom-attrs/src/main</warSourceDirectory>
-          <archive>
-            <manifest>
-              <addExtensions>true</addExtensions>
-              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-            </manifest>
-            <manifestEntries>
-              <Custom-Version>2.0</Custom-Version>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/src/test/resources/unit/manifest/manifest-with-main-class/plugin-config.xml b/src/test/resources/unit/manifest/manifest-with-main-class/plugin-config.xml
deleted file mode 100644
index 078b547..0000000
--- a/src/test/resources/unit/manifest/manifest-with-main-class/plugin-config.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-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.
--->
-
-<project>
-  <name>war-plugin-test</name>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-war-plugin</artifactId>
-        <configuration>
-          <project implementation="org.apache.maven.plugins.war.stub.MavenProjectArtifactsStub" />
-          <warSourceDirectory>${basedir}/target/test-classes/unit/manifest/manifest-with-main-class/src/main</warSourceDirectory>
-          <archive>
-            <manifest>
-              <mainClass>org.dummy.test.SomeClass</mainClass>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/src/test/resources/unit/manifest/manifest-with-other-attrs/plugin-config.xml b/src/test/resources/unit/manifest/manifest-with-other-attrs/plugin-config.xml
deleted file mode 100644
index 66d2484..0000000
--- a/src/test/resources/unit/manifest/manifest-with-other-attrs/plugin-config.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-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.
--->
-
-<project>
-  <name>war-plugin-test</name>
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-war-plugin</artifactId>
-        <configuration>
-          <project implementation="org.apache.maven.plugins.war.stub.MavenProjectBasicStub"/>
-          <warSourceDirectory>
-            ${basedir}/target/test-classes/unit/manifest/manifest-with-other-attrs/src/main</warSourceDirectory>
-          <archive>
-            <manifest>
-              <addExtensions>true</addExtensions>
-              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
