diff --git a/maven-script/maven-script-ant/pom.xml b/maven-script/maven-script-ant/pom.xml
deleted file mode 100644
index 1b79ca8..0000000
--- a/maven-script/maven-script-ant/pom.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.maven</groupId>
-    <artifactId>maven-script</artifactId>
-    <version>2.2.2-RC1-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>maven-script-ant</artifactId>
-
-  <name>Maven Ant Mojo Support</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <version>1.7.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant-launcher</artifactId>
-      <version>1.7.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-ant-factory</artifactId>
-      <version>1.0-alpha-2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-container-default</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-descriptor</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-archiver</artifactId>
-      <version>1.0-alpha-11</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntMojoComponentFactory.java b/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntMojoComponentFactory.java
deleted file mode 100644
index 159bc16..0000000
--- a/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntMojoComponentFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.apache.maven.script.ant;
-
-/*
- * 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.codehaus.classworlds.ClassRealm;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.component.factory.ComponentInstantiationException;
-import org.codehaus.plexus.component.factory.ant.AntComponentFactory;
-import org.codehaus.plexus.component.factory.ant.AntScriptInvoker;
-import org.codehaus.plexus.component.repository.ComponentDescriptor;
-
-public class AntMojoComponentFactory
-    extends AntComponentFactory
-{
-
-    public Object newInstance( ComponentDescriptor descriptor, ClassRealm realm, PlexusContainer container )
-        throws ComponentInstantiationException
-    {
-        return new AntMojoWrapper( (AntScriptInvoker) super.newInstance( descriptor, realm, container ) );
-    }
-
-}
diff --git a/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntMojoWrapper.java b/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntMojoWrapper.java
deleted file mode 100644
index 1e42829..0000000
--- a/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntMojoWrapper.java
+++ /dev/null
@@ -1,378 +0,0 @@
-package org.apache.maven.script.ant;
-
-/*
- * 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.artifact.Artifact;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.ContextEnabled;
-import org.apache.maven.plugin.MojoExecution;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
-import org.apache.maven.plugin.descriptor.PluginDescriptor;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.path.PathTranslator;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.PropertyHelper;
-import org.apache.tools.ant.types.Path;
-import org.codehaus.plexus.archiver.ArchiverException;
-import org.codehaus.plexus.archiver.UnArchiver;
-import org.codehaus.plexus.archiver.zip.ZipUnArchiver;
-import org.codehaus.plexus.component.MapOrientedComponent;
-import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.component.factory.ant.AntComponentExecutionException;
-import org.codehaus.plexus.component.factory.ant.AntScriptInvoker;
-import org.codehaus.plexus.component.repository.ComponentRequirement;
-import org.codehaus.plexus.logging.LogEnabled;
-import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.util.StringUtils;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-
-public class AntMojoWrapper
-    extends AbstractMojo
-    implements ContextEnabled, MapOrientedComponent, LogEnabled
-{
-
-    private Map pluginContext;
-    
-    private final AntScriptInvoker scriptInvoker;
-
-    private Project antProject;
-
-    private MavenProject mavenProject;
-
-    private MojoExecution mojoExecution;
-
-    private MavenSession session;
-    
-    private PathTranslator pathTranslator;
-
-    private Logger logger;
-    
-    private transient List unconstructedParts = new ArrayList();
-
-    public AntMojoWrapper( AntScriptInvoker scriptInvoker )
-    {
-        this.scriptInvoker = scriptInvoker;
-    }
-
-    public void execute()
-        throws MojoExecutionException
-    {
-        if ( antProject == null )
-        {
-            antProject = scriptInvoker.getProject();
-        }
-        
-        Map allConfig = new HashMap();
-        if ( pluginContext != null && !pluginContext.isEmpty() )
-        {
-            allConfig.putAll( pluginContext );
-        }
-        
-        Map refs = scriptInvoker.getReferences();
-        if ( refs != null )
-        {
-            allConfig.putAll( refs );
-            
-            for ( Iterator it = refs.entrySet().iterator(); it.hasNext(); )
-            {
-                Map.Entry entry = (Map.Entry) it.next();
-                String key = (String) entry.getKey();
-                if ( key.startsWith( PathTranslator.class.getName() ) )
-                {
-                    pathTranslator = (PathTranslator) entry.getValue();
-                }
-            }
-        }
-
-        mavenProject = (MavenProject) allConfig.get( "project" );
-        
-        mojoExecution = (MojoExecution) allConfig.get( "mojoExecution" );
-        
-        session = (MavenSession) allConfig.get( "session" );
-        
-        unpackFileBasedResources();
-
-        addClasspathReferences();
-        
-        if ( logger.isDebugEnabled() && !unconstructedParts.isEmpty() )
-        {
-            StringBuffer buffer = new StringBuffer();
-            
-            buffer.append( "The following standard Maven Ant-mojo support objects could not be created:\n\n" );
-            
-            for ( Iterator it = unconstructedParts.iterator(); it.hasNext(); )
-            {
-                String part = (String) it.next();
-                buffer.append( "\n-  " ).append( part );
-            }
-            
-            buffer.append( "\n\nMaven project, session, mojo-execution, or path-translation parameter information is " );
-            buffer.append( "\nmissing from this mojo's plugin descriptor." );
-            buffer.append( "\n\nPerhaps this Ant-based mojo depends on maven-script-ant < 2.1.0, " );
-            buffer.append( "or used maven-plugin-tools-ant < 2.2 during release?\n\n" );
-            
-            logger.debug( buffer.toString() );
-        }
-
-        try
-        {
-            scriptInvoker.invoke();
-        }
-        catch ( AntComponentExecutionException e )
-        {
-            throw new MojoExecutionException( "Failed to execute: " + e.getMessage(), e );
-        }
-        
-        unconstructedParts.clear();
-    }
-
-    public void setPluginContext( Map pluginContext )
-    {
-        this.pluginContext = pluginContext;
-    }
-
-    public Map getPluginContext()
-    {
-        return pluginContext;
-    }
-
-    public void addComponentRequirement( ComponentRequirement requirementDescriptor, Object requirementValue )
-        throws ComponentConfigurationException
-    {
-        scriptInvoker.addComponentRequirement( requirementDescriptor, requirementValue );
-    }
-
-    public void setComponentConfiguration( Map componentConfiguration )
-        throws ComponentConfigurationException
-    {
-        scriptInvoker.setComponentConfiguration( componentConfiguration );
-        antProject = scriptInvoker.getProject();
-    }
-
-    private void unpackFileBasedResources()
-        throws MojoExecutionException
-    {
-        if ( mojoExecution == null || mavenProject == null )
-        {
-            unconstructedParts.add( "Unpacked Ant build scripts (in Maven build directory)." );
-            
-            return;
-        }
-        
-        // What we need to write out any resources in the plugin to the target directory of the
-        // mavenProject using the Ant-based plugin:
-        //
-        // 1. Need a reference to the plugin JAR itself
-        // 2. Need a reference to the ${basedir} of the mavenProject
-
-        PluginDescriptor pluginDescriptor = mojoExecution.getMojoDescriptor().getPluginDescriptor();
-        
-        File pluginJar = pluginDescriptor.getPluginArtifact().getFile();
-
-        String resourcesPath = pluginDescriptor.getArtifactId();
-
-        File outputDirectory = new File( mavenProject.getBuild().getDirectory() );
-
-        try
-        {
-            UnArchiver ua = new ZipUnArchiver( pluginJar );
-
-            ua.extract( resourcesPath, outputDirectory );
-        }
-        catch ( ArchiverException e )
-        {
-            throw new MojoExecutionException( "Error extracting resources from your Ant-based plugin.", e );
-        }
-    }
-
-    private void addClasspathReferences()
-        throws MojoExecutionException
-    {
-        try
-        {
-            if ( mavenProject != null && session != null && pathTranslator != null )
-            {
-                ExpressionEvaluator exprEvaluator =
-                    new PluginParameterExpressionEvaluator( session, mojoExecution, pathTranslator, logger, mavenProject,
-                                                            mavenProject.getProperties() );
-                
-                PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper( antProject );
-                propertyHelper.setNext( new AntPropertyHelper( exprEvaluator, mavenProject.getArtifacts(), getLog() ) );
-            }
-            else
-            {
-                unconstructedParts.add( "Maven parameter expression evaluator for Ant properties." );
-            }
-
-            if ( mavenProject != null )
-            {
-                // Compile classpath
-                Path p = new Path( antProject );
-
-                p.setPath( StringUtils.join( mavenProject.getCompileClasspathElements().iterator(), File.pathSeparator ) );
-
-                /* maven.dependency.classpath it's deprecated as it's equal to maven.compile.classpath */
-                scriptInvoker.getReferences().put( "maven.dependency.classpath", p );
-                antProject.addReference( "maven.dependency.classpath", p );
-                
-                scriptInvoker.getReferences().put( "maven.compile.classpath", p );
-                antProject.addReference( "maven.compile.classpath", p );
-
-                // Runtime classpath
-                p = new Path( antProject );
-
-                p.setPath( StringUtils.join( mavenProject.getRuntimeClasspathElements().iterator(), File.pathSeparator ) );
-
-                scriptInvoker.getReferences().put( "maven.runtime.classpath", p );
-                antProject.addReference( "maven.runtime.classpath", p );
-
-                // Test classpath
-                p = new Path( antProject );
-
-                p.setPath( StringUtils.join( mavenProject.getTestClasspathElements().iterator(), File.pathSeparator ) );
-
-                scriptInvoker.getReferences().put( "maven.test.classpath", p );
-                antProject.addReference( "maven.test.classpath", p );
-
-            }
-            else
-            {
-                unconstructedParts.add( "Maven standard project-based classpath references." );
-            }
-            
-            if ( mojoExecution != null )
-            {
-                // Plugin dependency classpath
-
-                Path p = getPathFromArtifacts( mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifacts(), antProject );
-                
-                scriptInvoker.getReferences().put( "maven.plugin.classpath", p );
-                antProject.addReference( "maven.plugin.classpath", p );
-            }
-            else
-            {
-                unconstructedParts.add( "Maven standard plugin-based classpath references." );
-            }
-        }
-        catch ( DependencyResolutionRequiredException e )
-        {
-            throw new MojoExecutionException( "Error creating classpath references for Ant-based plugin scripts.", e  );
-        }
-    }
-
-    public Path getPathFromArtifacts( Collection artifacts,
-                                      Project antProject )
-        throws DependencyResolutionRequiredException
-    {
-        List list = new ArrayList( artifacts.size() );
-
-        for ( Iterator i = artifacts.iterator(); i.hasNext(); )
-        {
-            Artifact a = (Artifact) i.next();
-
-            File file = a.getFile();
-
-            if ( file == null )
-            {
-                throw new DependencyResolutionRequiredException( a );
-            }
-
-            list.add( file.getPath() );
-        }
-
-        Path p = new Path( antProject );
-
-        p.setPath( StringUtils.join( list.iterator(), File.pathSeparator ) );
-
-        return p;
-    }
-
-    public Project getAntProject()
-    {
-        return antProject;
-    }
-
-    public void setAntProject( Project antProject )
-    {
-        this.antProject = antProject;
-    }
-
-    public MavenProject getMavenProject()
-    {
-        return mavenProject;
-    }
-
-    public void setMavenProject( MavenProject mavenProject )
-    {
-        this.mavenProject = mavenProject;
-    }
-
-    public MojoExecution getMojoExecution()
-    {
-        return mojoExecution;
-    }
-
-    public void setMojoExecution( MojoExecution mojoExecution )
-    {
-        this.mojoExecution = mojoExecution;
-    }
-
-    public MavenSession getSession()
-    {
-        return session;
-    }
-
-    public void setSession( MavenSession session )
-    {
-        this.session = session;
-    }
-
-    public PathTranslator getPathTranslator()
-    {
-        return pathTranslator;
-    }
-
-    public void setPathTranslator( PathTranslator pathTranslator )
-    {
-        this.pathTranslator = pathTranslator;
-    }
-
-    public AntScriptInvoker getScriptInvoker()
-    {
-        return scriptInvoker;
-    }
-
-    public void enableLogging( Logger logger )
-    {
-        this.logger = logger;
-    }
-}
diff --git a/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntPropertyHelper.java b/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntPropertyHelper.java
deleted file mode 100644
index ef7aba7..0000000
--- a/maven-script/maven-script-ant/src/main/java/org/apache/maven/script/ant/AntPropertyHelper.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package org.apache.maven.script.ant;
-
-/*
- * 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 java.util.Collections;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.apache.tools.ant.PropertyHelper;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
-
-/**
- * Makes the ${expressions} used in Maven available to Ant as properties.
- *
- * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
- */
-public class AntPropertyHelper
-    extends PropertyHelper
-{
-    private static final String DEPENDENCY_PREFIX = "maven.dependency.";
-    private Log log;
-    private ExpressionEvaluator exprEvaluator;
-    private MavenProject mavenProject;
-    private Map artifactMap = new Hashtable();
-
-    /**
-     * @deprecated use the other constructor
-     * @param project
-     * @param l
-     */
-    public AntPropertyHelper( MavenProject project, Log l )
-    {
-        mavenProject = project;
-        log = l;
-    }
-
-    /**
-     * @deprecated use {@link #AntPropertyHelper(ExpressionEvaluator, Set, Log)} to resolve maven.dependency.* properties
-     * @param exprEvaluator
-     * @param l
-     */
-    public AntPropertyHelper( ExpressionEvaluator exprEvaluator, Log l )
-    {
-        this( exprEvaluator, Collections.EMPTY_SET, l );
-    }
-
-    /**
-     * @param exprEvaluator
-     * @param artifacts
-     * @param l
-     */
-    public AntPropertyHelper( ExpressionEvaluator exprEvaluator, Set artifacts, Log l )
-    {
-        this.mavenProject = null;
-        this.exprEvaluator = exprEvaluator;
-        this.log = l;
-
-        for ( Iterator it = artifacts.iterator(); it.hasNext(); )
-        {
-            Artifact artifact = (Artifact) it.next();
-
-            String key = DEPENDENCY_PREFIX + artifact.getGroupId() + "." + artifact.getArtifactId()
-                + ( artifact.getClassifier() != null ? "." + artifact.getClassifier() : "" )
-                + ( artifact.getType() != null ? "." + artifact.getType() : "" ) + ".path";
-
-            log.debug( "Storing: " + key + "=" + artifact.getFile().getPath() );
-
-            artifactMap.put( key, artifact.getFile().getPath() );
-        }
-    }
-
-    /**
-     * @see org.apache.tools.ant.PropertyHelper#getPropertyHook(java.lang.String, java.lang.String, boolean)
-     */
-    public synchronized Object getPropertyHook( String ns, String name, boolean user )
-    {
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "getProperty(ns=" + ns + ", name=" + name + ", user=" + user + ")" );
-        }
-
-        /* keep old behaviour */
-        if ( mavenProject != null )
-        {
-            return getPropertyHook( ns, name, user, mavenProject );
-        }
-
-
-        Object val = null;
-
-        if ( name.startsWith( DEPENDENCY_PREFIX ) )
-        {
-            val = (String) artifactMap.get( name );
-        }
-
-        if ( val == null )
-        {
-            try
-            {
-                val = exprEvaluator.evaluate( "${" + name + "}" );
-            }
-            catch ( ExpressionEvaluationException e )
-            {
-                if ( log.isErrorEnabled() )
-                {
-                    log.error( "Failed to evaluate expression", e );
-                }
-            }
-        }
-
-        if ( val == null )
-        {
-            val = super.getPropertyHook( ns, name, user );
-
-            if ( val == null )
-            {
-                val = System.getProperty( name.toString() );
-            }
-        }
-
-        return val;
-    }
-
-    /**
-     * @deprecated added to keep backwards compatibility
-     * @param ns
-     * @param name
-     * @param user
-     * @param mavenProject
-     * @return The property value.
-     */
-    private Object getPropertyHook( String ns, String name, boolean user, MavenProject mavenProject )
-    {
-        Object val = null;
-        try
-        {
-            if ( name.startsWith( DEPENDENCY_PREFIX ) )
-            {
-                val = (String) artifactMap.get( name );
-            }
-            else if ( name.startsWith( "project." ) )
-            {
-                val = ReflectionValueExtractor.evaluate(
-                    name,
-                    mavenProject,
-                    true
-                );
-            }
-            else if ( name.equals( "basedir" ) )
-            {
-                val = ReflectionValueExtractor.evaluate(
-                    "basedir.path",
-                    mavenProject,
-                    false
-                );
-            }
-        }
-        catch ( Exception e )
-        {
-            if ( log.isWarnEnabled() )
-            {
-                log.warn( "Error evaluating expression '" + name + "'", e );
-            }
-        }
-
-        if ( val == null )
-        {
-            val = super.getPropertyHook( ns, name, user );
-            if ( val == null )
-            {
-                val = System.getProperty( name.toString() );
-            }
-        }
-
-        if ( val instanceof File )
-        {
-            val = ( (File) val ).getAbsoluteFile();
-        }
-
-        return val;
-    }
-}
diff --git a/maven-script/maven-script-ant/src/main/resources/META-INF/plexus/components.xml b/maven-script/maven-script-ant/src/main/resources/META-INF/plexus/components.xml
deleted file mode 100644
index cadddea..0000000
--- a/maven-script/maven-script-ant/src/main/resources/META-INF/plexus/components.xml
+++ /dev/null
@@ -1,28 +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.
--->
-
-<component-set>
-  <components>
-    <component>
-      <role>org.codehaus.plexus.component.factory.ComponentFactory</role>
-      <implementation>org.apache.maven.script.ant.AntMojoComponentFactory</implementation>
-      <role-hint>ant-mojo</role-hint>
-    </component>
-  </components>
-</component-set>
diff --git a/maven-script/maven-script-ant/src/site/site.xml b/maven-script/maven-script-ant/src/site/site.xml
deleted file mode 100644
index 3a16bf9..0000000
--- a/maven-script/maven-script-ant/src/site/site.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-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 xmlns="http://maven.apache.org/DECORATION/1.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="JavaDocs" href="apidocs/index.html"/>
-      <item name="Source Xref" href="xref/index.html"/>
-      <!--item name="FAQ" href="faq.html"/-->
-    </menu>
-
-    <menu ref="parent"/>
-    <menu ref="reports"/>
-  </body>
-</project>
\ No newline at end of file
diff --git a/maven-script/maven-script-ant/src/test/java/org/apache/maven/script/ant/AntMojoWrapperTest.java b/maven-script/maven-script-ant/src/test/java/org/apache/maven/script/ant/AntMojoWrapperTest.java
deleted file mode 100644
index 17135f7..0000000
--- a/maven-script/maven-script-ant/src/test/java/org/apache/maven/script/ant/AntMojoWrapperTest.java
+++ /dev/null
@@ -1,287 +0,0 @@
-package org.apache.maven.script.ant;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.model.Build;
-import org.apache.maven.model.Model;
-import org.apache.maven.plugin.MojoExecution;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.descriptor.MojoDescriptor;
-import org.apache.maven.plugin.descriptor.PluginDescriptor;
-import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.path.PathTranslator;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildListener;
-import org.codehaus.plexus.archiver.ArchiverException;
-import org.codehaus.plexus.archiver.jar.JarArchiver;
-import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
-import org.codehaus.plexus.component.factory.ComponentInstantiationException;
-import org.codehaus.plexus.component.factory.ant.AntScriptInvoker;
-import org.codehaus.plexus.component.repository.ComponentRequirement;
-import org.codehaus.plexus.configuration.PlexusConfigurationException;
-import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.logging.console.ConsoleLogger;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-import org.easymock.MockControl;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.io.Reader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-public class AntMojoWrapperTest
-    extends TestCase
-{
-
-    public void test2xStylePlugin()
-        throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
-        ComponentConfigurationException, ArchiverException
-    {
-        String pluginXml = "META-INF/maven/plugin-2.1.xml";
-
-        List messages = run( pluginXml, true );
-
-        assertPresence( messages, "Unpacked Ant build scripts (in Maven build directory).", false );
-        assertPresence( messages, "Maven parameter expression evaluator for Ant properties.", false );
-        assertPresence( messages, "Maven standard project-based classpath references.", false );
-        assertPresence( messages, "Maven standard plugin-based classpath references.", false );
-        assertPresence( messages,
-                        "Maven project, session, mojo-execution, or path-translation parameter information is", false );
-        assertPresence( messages, "maven-script-ant < 2.1.0, or used maven-plugin-tools-ant < 2.2 during release",
-                        false );
-
-        assertPresence( messages, "path-is-missing", false );
-    }
-
-    public void test20StylePlugin()
-        throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
-        ComponentConfigurationException, ArchiverException
-    {
-        String pluginXml = "META-INF/maven/plugin-2.0.xml";
-
-        List messages = run( pluginXml, false );
-
-        assertPresence( messages, "Unpacked Ant build scripts (in Maven build directory).", true );
-        assertPresence( messages, "Maven parameter expression evaluator for Ant properties.", true );
-        assertPresence( messages, "Maven standard project-based classpath references.", true );
-        assertPresence( messages, "Maven standard plugin-based classpath references.", true );
-        assertPresence( messages,
-                        "Maven project, session, mojo-execution, or path-translation parameter information is", true );
-        assertPresence( messages, "maven-script-ant < 2.1.0, or used maven-plugin-tools-ant < 2.2 during release", true );
-
-        assertPresence( messages, "path-is-missing", true );
-    }
-
-    private void assertPresence( List messages, String test, boolean shouldBePresent )
-    {
-        boolean found = false;
-
-        for ( Iterator it = messages.iterator(); it.hasNext(); )
-        {
-            String message = (String) it.next();
-            if ( message.indexOf( test ) > -1 )
-            {
-                found = true;
-                break;
-            }
-        }
-
-        if ( !shouldBePresent && found )
-        {
-            fail( "Test string: '" + test + "' was found in output, but SHOULD NOT BE THERE." );
-        }
-        else if ( shouldBePresent && !found )
-        {
-            fail( "Test string: '" + test + "' was NOT found in output, but SHOULD BE THERE." );
-        }
-    }
-
-    private List run( String pluginXml, boolean includeImplied )
-        throws PlexusConfigurationException, IOException, ComponentInstantiationException, MojoExecutionException,
-        ComponentConfigurationException, ArchiverException
-    {
-        StackTraceElement stack = new Throwable().getStackTrace()[1];
-        System.out.println( "\n\nRunning: " + stack.getMethodName() + "\n\n" );
-
-        URL resource = Thread.currentThread().getContextClassLoader().getResource( pluginXml );
-
-        if ( resource == null )
-        {
-            fail( "plugin descriptor not found: '" + pluginXml + "'." );
-        }
-
-        Reader reader = null;
-        PluginDescriptor pd;
-        try
-        {
-            reader = new InputStreamReader( resource.openStream() );
-            pd = new PluginDescriptorBuilder().build( reader, pluginXml );
-        }
-        finally
-        {
-            IOUtil.close( reader );
-        }
-
-        Map config = new HashMap();
-        config.put( "basedir", new File( "." ).getAbsoluteFile() );
-        config.put( "messageLevel", "info" );
-
-        MojoDescriptor md = pd.getMojo( "test" );
-
-        AntMojoWrapper wrapper =
-            new AntMojoWrapper( new AntScriptInvoker( md, Thread.currentThread().getContextClassLoader() ) );
-
-        wrapper.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) );
-
-        MockControl artifactCtl = null;
-        MockControl pathTranslatorCtl = null;
-        if ( includeImplied )
-        {
-            File pluginXmlFile = new File( StringUtils.replace( resource.getPath(), "%20", " " ) );
-
-            File jarFile = File.createTempFile( "AntMojoWrapperTest.", ".test.jar" );
-            jarFile.deleteOnExit();
-
-            JarArchiver archiver = new JarArchiver();
-            archiver.enableLogging( new ConsoleLogger( Logger.LEVEL_ERROR, "archiver" ) );
-            archiver.setDestFile( jarFile );
-            archiver.addFile( pluginXmlFile, pluginXml );
-            archiver.createArchive();
-
-            artifactCtl = MockControl.createControl( Artifact.class );
-            Artifact artifact = (Artifact) artifactCtl.getMock();
-
-            artifact.getFile();
-            artifactCtl.setReturnValue( jarFile, MockControl.ZERO_OR_MORE );
-
-            artifact.getGroupId();
-            artifactCtl.setReturnValue( "groupId", MockControl.ZERO_OR_MORE );
-
-            artifact.getArtifactId();
-            artifactCtl.setReturnValue( "artifactId", MockControl.ZERO_OR_MORE );
-
-            artifact.getVersion();
-            artifactCtl.setReturnValue( "1", MockControl.ZERO_OR_MORE );
-
-            artifact.getId();
-            artifactCtl.setReturnValue( "groupId:artifactId:jar:1", MockControl.ZERO_OR_MORE );
-
-            artifact.getClassifier();
-            artifactCtl.setReturnValue( null, MockControl.ZERO_OR_MORE );
-
-            pathTranslatorCtl = MockControl.createControl( PathTranslator.class );
-            PathTranslator pt = (PathTranslator) pathTranslatorCtl.getMock();
-
-            Model model = new Model();
-
-            Build build = new Build();
-            build.setDirectory( "target" );
-
-            model.setBuild( build );
-
-            MavenProject project = new MavenProject( model );
-            project.setFile( new File( "pom.xml" ).getAbsoluteFile() );
-
-            artifactCtl.replay();
-            pathTranslatorCtl.replay();
-
-            pd.setPluginArtifact( artifact );
-            pd.setArtifacts( Collections.singletonList( artifact ) );
-
-            config.put( "project", project );
-            config.put( "session", new MavenSession( null, null, null, null, null, null, null, null, null, null ) );
-            config.put( "mojoExecution", new MojoExecution( md ) );
-
-            ComponentRequirement cr = new ComponentRequirement();
-            cr.setRole( PathTranslator.class.getName() );
-
-            wrapper.addComponentRequirement( cr, pt );
-        }
-
-        wrapper.setComponentConfiguration( config );
-
-        TestBuildListener tbl = new TestBuildListener();
-        wrapper.getAntProject().addBuildListener( tbl );
-        
-        PrintStream oldOut = System.out;
-        
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try
-        {
-            System.setOut( new PrintStream( baos ) );
-
-            wrapper.execute();
-        }
-        finally
-        {
-            System.setOut( oldOut );
-        }
-
-        System.out.println( "\n\n" + stack.getMethodName() + " executed; verifying...\n\n" );
-
-        if ( includeImplied )
-        {
-            artifactCtl.verify();
-            pathTranslatorCtl.verify();
-        }
-
-        List messages = new ArrayList();
-        if ( !tbl.messages.isEmpty() )
-        {
-            messages.addAll( tbl.messages );
-        }
-        
-        messages.add( new String( baos.toByteArray() ) );
-        
-        return messages;
-    }
-
-    private static final class TestBuildListener
-        implements BuildListener
-    {
-        private List messages = new ArrayList();
-
-        public void buildFinished( BuildEvent arg0 )
-        {
-        }
-
-        public void buildStarted( BuildEvent arg0 )
-        {
-        }
-
-        public void messageLogged( BuildEvent event )
-        {
-            messages.add( event.getMessage() );
-        }
-
-        public void targetFinished( BuildEvent arg0 )
-        {
-        }
-
-        public void targetStarted( BuildEvent arg0 )
-        {
-        }
-
-        public void taskFinished( BuildEvent arg0 )
-        {
-        }
-
-        public void taskStarted( BuildEvent arg0 )
-        {
-        }
-    };
-
-}
diff --git a/maven-script/maven-script-ant/src/test/resources/META-INF/maven/plugin-2.0.xml b/maven-script/maven-script-ant/src/test/resources/META-INF/maven/plugin-2.0.xml
deleted file mode 100644
index c66cf12..0000000
--- a/maven-script/maven-script-ant/src/test/resources/META-INF/maven/plugin-2.0.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<plugin>
-  <description>Test Plugin</description>
-  <groupId>org.myplugin</groupId>
-  <artifactId>my-plugin</artifactId>
-  <version>1</version>
-  <goalPrefix>myplugin</goalPrefix>
-  <isolatedRealm>false</isolatedRealm>
-  <inheritedByDefault>true</inheritedByDefault>
-  <mojos>
-    <mojo>
-      <goal>test</goal>
-      <description>Build a JAR from the current project.</description>
-      <requiresDirectInvocation>false</requiresDirectInvocation>
-      <requiresProject>false</requiresProject>
-      <requiresReports>false</requiresReports>
-      <aggregator>false</aggregator>
-      <requiresOnline>false</requiresOnline>
-      <inheritedByDefault>true</inheritedByDefault>
-      <implementation>test.build.xml:test</implementation>
-      <language>ant</language>
-      <instantiationStrategy>per-lookup</instantiationStrategy>
-      <executionStrategy>once-per-session</executionStrategy>
-      <parameters>
-		<parameter>
-			<name>basedir</name>
-			<required>true</required>
-			<editable>false</editable>
-			<type>java.io.File</type>
-		</parameter>
-		<parameter>
-			<name>messageLevel</name>
-			<required>true</required>
-			<editable>false</editable>
-			<type>java.lang.String</type>
-		</parameter>
-      </parameters>
-      <configuration>
-        <basedir implementation="java.io.File">${basedir}</basedir>
-        <messageLevel implementation="java.lang.String">${messageLevel}</messageLevel>
-      </configuration>
-    </mojo>
-  </mojos>
-</plugin>
\ No newline at end of file
diff --git a/maven-script/maven-script-ant/src/test/resources/META-INF/maven/plugin-2.1.xml b/maven-script/maven-script-ant/src/test/resources/META-INF/maven/plugin-2.1.xml
deleted file mode 100644
index b4ebf00..0000000
--- a/maven-script/maven-script-ant/src/test/resources/META-INF/maven/plugin-2.1.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<plugin>
-  <description>Test Plugin</description>
-  <groupId>org.myplugin</groupId>
-  <artifactId>my-plugin</artifactId>
-  <version>1</version>
-  <goalPrefix>myplugin</goalPrefix>
-  <isolatedRealm>false</isolatedRealm>
-  <inheritedByDefault>true</inheritedByDefault>
-  <mojos>
-    <mojo>
-      <goal>test</goal>
-      <description>Build a JAR from the current project.</description>
-      <requiresDirectInvocation>false</requiresDirectInvocation>
-      <requiresProject>false</requiresProject>
-      <requiresReports>false</requiresReports>
-      <aggregator>false</aggregator>
-      <requiresOnline>false</requiresOnline>
-      <inheritedByDefault>true</inheritedByDefault>
-      <implementation>test.build.xml:test</implementation>
-      <language>ant</language>
-      <instantiationStrategy>per-lookup</instantiationStrategy>
-      <executionStrategy>once-per-session</executionStrategy>
-      <parameters>
-		<parameter>
-			<name>basedir</name>
-			<required>true</required>
-			<editable>false</editable>
-			<type>java.io.File</type>
-		</parameter>
-		<parameter>
-			<name>messageLevel</name>
-			<required>true</required>
-			<editable>false</editable>
-			<type>java.lang.String</type>
-		</parameter>
-		<parameter>
-			<name>project</name>
-			<required>true</required>
-			<editable>false</editable>
-			<type>org.apache.maven.project.MavenProject</type>
-		</parameter>
-		<parameter>
-			<name>session</name>
-			<required>true</required>
-			<editable>false</editable>
-			<type>org.apache.maven.execution.MavenSession</type>
-		</parameter>
-		<parameter>
-			<name>mojoExecution</name>
-			<required>true</required>
-			<editable>false</editable>
-			<type>org.apache.maven.plugin.MojoExecution</type>
-		</parameter>
-      </parameters>
-      <configuration>
-        <project implementation="org.apache.maven.project.MavenProject">${project}</project>
-        <session implementation="org.apache.maven.execution.MavenSession">${session}</session>
-        <mojoExecution implementation="org.apache.maven.plugin.MojoExecution">${mojoExecution}</mojoExecution>
-        <basedir implementation="java.io.File">${basedir}</basedir>
-        <messageLevel implementation="java.lang.String">${messageLevel}</messageLevel>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.project.path.PathTranslator</role>
-        </requirement>
-      </requirements>
-    </mojo>
-  </mojos>
-</plugin>
\ No newline at end of file
diff --git a/maven-script/maven-script-ant/src/test/resources/test.build.xml b/maven-script/maven-script-ant/src/test/resources/test.build.xml
deleted file mode 100644
index 5f47054..0000000
--- a/maven-script/maven-script-ant/src/test/resources/test.build.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<project>
-  <target name="init-cp" unless="cp-exists">
-  	<path id="maven.plugin.classpath" location="path-is-missing"/>
-  </target>
-  	
-  <target name="test">
-  	<condition property="cp-exists">
-  		<isreference refid="maven.plugin.classpath"/>
-  	</condition>
-    <antcall target="init-cp" inheritall="true"/>
-  	
-  	<property name="cp" refId="maven.plugin.classpath"/>
-    <echo>plugin classpath is: ${cp}</echo>
-  </target>
-</project>
\ No newline at end of file
diff --git a/maven-script/maven-script-beanshell/pom.xml b/maven-script/maven-script-beanshell/pom.xml
deleted file mode 100644
index 9d684fe..0000000
--- a/maven-script/maven-script-beanshell/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.maven</groupId>
-    <artifactId>maven-script</artifactId>
-    <version>2.2.2-RC1-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>maven-script-beanshell</artifactId>
-
-  <name>Maven Beanshell Mojo Support</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-bsh-factory</artifactId>
-      <version>1.0-alpha-7</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/maven-script/maven-script-beanshell/src/main/java/org/apache/maven/script/beanshell/BeanshellMojoAdapter.java b/maven-script/maven-script-beanshell/src/main/java/org/apache/maven/script/beanshell/BeanshellMojoAdapter.java
deleted file mode 100644
index 8ec8cad..0000000
--- a/maven-script/maven-script-beanshell/src/main/java/org/apache/maven/script/beanshell/BeanshellMojoAdapter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.apache.maven.script.beanshell;
-
-/*
- * 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 bsh.EvalError;
-import bsh.Interpreter;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.Mojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.codehaus.plexus.component.factory.bsh.BshComponent;
-
-/**
- * Mojo adapter for a Beanshell Mojo.
- *
- * @todo should log be passed in, or rely on getLog() ?
- *
- * @author <a href="mailto:brett@apache.org">Brett Porter</a>
- * @version $Id$
- */
-public class BeanshellMojoAdapter
-    extends AbstractMojo
-    implements BshComponent
-{
-    private Mojo mojo;
-
-    private Interpreter interpreter;
-
-    public BeanshellMojoAdapter( Mojo mojo, Interpreter interpreter )
-    {
-        this.mojo = mojo;
-        this.interpreter = interpreter;
-    }
-
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        try
-        {
-            interpreter.set( "logger", getLog() );
-
-            // TODO: set out, err to a print stream that will log at info, error respectively
-        }
-        catch ( EvalError evalError )
-        {
-            throw new MojoExecutionException( "Unable to establish mojo", evalError );
-        }
-
-        mojo.execute();
-    }
-
-    public Interpreter getInterpreter()
-    {
-        return interpreter;
-    }
-}
diff --git a/maven-script/maven-script-beanshell/src/site/site.xml b/maven-script/maven-script-beanshell/src/site/site.xml
deleted file mode 100644
index 3a16bf9..0000000
--- a/maven-script/maven-script-beanshell/src/site/site.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-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 xmlns="http://maven.apache.org/DECORATION/1.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-  <body>
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="JavaDocs" href="apidocs/index.html"/>
-      <item name="Source Xref" href="xref/index.html"/>
-      <!--item name="FAQ" href="faq.html"/-->
-    </menu>
-
-    <menu ref="parent"/>
-    <menu ref="reports"/>
-  </body>
-</project>
\ No newline at end of file
diff --git a/maven-script/pom.xml b/maven-script/pom.xml
deleted file mode 100644
index d672e9e..0000000
--- a/maven-script/pom.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.maven</groupId>
-    <artifactId>maven</artifactId>
-    <version>2.2.2-RC1-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>maven-script</artifactId>
-  <packaging>pom</packaging>
-
-  <name>Maven Script Support Root</name>
-
-  <modules>
-    <module>maven-script-ant</module>
-    <module>maven-script-beanshell</module>
-  </modules>
-</project>
diff --git a/maven-script/src/site/site.xml b/maven-script/src/site/site.xml
deleted file mode 100644
index 67aa11c..0000000
--- a/maven-script/src/site/site.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-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 xmlns="http://maven.apache.org/DECORATION/1.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-  <body>
-    <menu ref="parent"/>
-    <menu ref="modules"/>
-    <menu ref="reports"/>
-  </body>
-</project>
\ No newline at end of file
