diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Project.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Project.java
new file mode 100644
index 000000000..bfb9e0126
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Project.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.myrmidon.libs.ant1;
+
+import java.io.File;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.logger.Loggable;
+import org.apache.log.Logger;
+import org.apache.myrmidon.api.TaskContext;
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.Project;
+
+public class Ant1Project
+ extends Project
+ implements Loggable, Contextualizable
+{
+ private Logger m_logger;
+
+ ///Variable to hold context for use by sub-classes
+ private TaskContext m_context;
+
+ public void setLogger( final Logger logger )
+ {
+ m_logger = logger;
+ }
+
+ protected final Logger getLogger()
+ {
+ return m_logger;
+ }
+
+ /**
+ * Retrieve context from container.
+ *
+ * @param context the context
+ */
+ public void contextualize( final Context context )
+ {
+ m_context = (TaskContext)context;
+ }
+
+ protected final TaskContext getContext()
+ {
+ return m_context;
+ }
+
+ /**
+ * Initialise the project.
+ */
+ public void init()
+ throws BuildException
+ {
+ setJavaVersionProperty();
+ }
+
+ public void setProperty( final String name, final String value )
+ {
+ try { getContext().setProperty( name, value ); }
+ catch( final Exception e )
+ {
+ getLogger().warn( "Failed to set property " + name + " to " + value, e );
+ }
+ }
+
+ public void setUserProperty( final String name, final String value )
+ {
+ setProperty( name, value );
+ }
+
+ public String getProperty( final String name )
+ {
+ return "" + getContext().getProperty( name );
+ }
+
+ public String getUserProperty( final String name )
+ {
+ return getProperty( name );
+ }
+
+ public String getName()
+ {
+ return "Ant1 Project";
+ }
+
+ public Task createTask( final String taskType )
+ throws BuildException
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object createDataType( final String typeName )
+ throws BuildException
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public File resolveFile( final String fileName )
+ {
+ try { return getContext().resolveFile( fileName ); }
+ catch( final Exception e )
+ {
+ return null;
+ }
+ }
+
+ protected void fireBuildStarted() {}
+ protected void fireBuildFinished(Throwable exception) {}
+ protected void fireTargetStarted(Target target) {}
+ protected void fireTargetFinished(Target target, Throwable exception) {}
+ protected void fireTaskStarted(Task task) {}
+ protected void fireTaskFinished(Task task, Throwable exception) {}
+
+ private void fireMessageLoggedEvent(BuildEvent event, String message, int priority)
+ {
+ messageLogged( message, priority );
+ }
+
+ protected void fireMessageLogged(Project project, String message, int priority)
+ {
+ messageLogged( message, priority );
+ }
+
+ protected void fireMessageLogged(Target target, String message, int priority)
+ {
+ messageLogged( message, priority );
+ }
+
+ protected void fireMessageLogged(Task task, String message, int priority)
+ {
+ messageLogged( message, priority );
+ }
+
+ private void messageLogged( String message, int priority )
+ {
+ switch( priority )
+ {
+ case MSG_ERR: getLogger().error( message ); break;
+ case MSG_WARN: getLogger().warn( message ); break;
+ case MSG_INFO: getLogger().info( message ); break;
+ case MSG_VERBOSE: getLogger().debug( message ); break;
+ case MSG_DEBUG: getLogger().debug( message ); break;
+
+ default:
+ getLogger().debug( message );
+ }
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Tasklib.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Tasklib.java
new file mode 100644
index 000000000..18b2dbeb6
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Tasklib.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.myrmidon.libs.ant1;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Properties;
+import org.apache.myrmidon.api.AbstractTask;
+import org.apache.myrmidon.api.TaskException;
+import org.apache.myrmidon.api.Task;
+import org.apache.avalon.framework.component.ComponentException;
+import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.component.Composable;
+import org.apache.myrmidon.components.type.TypeManager;
+
+/**
+ * Method to register a tasklib.
+ *
+ * @author Peter Donald
+ */
+public class Ant1Tasklib
+ extends AbstractTask
+ implements Composable
+{
+ private String m_prefix = "";
+ private File m_lib;
+ private TypeManager m_typeManager;
+
+ public void compose( final ComponentManager componentManager )
+ throws ComponentException
+ {
+ m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
+ }
+
+ public void setLib( final File lib )
+ {
+ m_lib = lib;
+ }
+
+ public void setPrefix( final String prefix )
+ {
+ m_prefix = prefix;
+ }
+
+ public void execute()
+ throws TaskException
+ {
+ if( null == m_lib )
+ {
+ throw new TaskException( "Must specify lib parameter" );
+ }
+
+
+ try
+ {
+ final String location = "jar:" + m_lib.toURL() +
+ "!/org/apache/tools/ant/taskdefs/defaults.properties";
+ final URL url = new URL( location );
+ final InputStream input = url.openStream();
+
+ final Properties tasks = new Properties();
+ tasks.load( input );
+
+ input.close();
+
+ final Ant1TypeFactory factory = new Ant1TypeFactory( m_lib.toURL() );
+
+ final Enumeration enum = tasks.propertyNames();
+ while( enum.hasMoreElements() )
+ {
+ final String rawName = (String)enum.nextElement();
+ final String className = tasks.getProperty( rawName );
+ final String name = m_prefix + rawName;
+
+ factory.addNameClassMapping( name, className );
+ m_typeManager.registerType( Task.ROLE, name, factory );
+ }
+ }
+ catch( final Exception e )
+ {
+ throw new TaskException( "Failed to load task definitions", e );
+ }
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1TypeFactory.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1TypeFactory.java
new file mode 100644
index 000000000..c8537ae27
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1TypeFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.myrmidon.libs.ant1;
+
+import java.net.URL;
+import org.apache.myrmidon.components.type.DefaultTypeFactory;
+import org.apache.myrmidon.components.type.TypeException;
+import org.apache.tools.ant.Task;
+
+/**
+ * Factory used to create adaptors for Ant1 tasks.
+ *
+ * @author Peter Donald
+ */
+public class Ant1TypeFactory
+ extends DefaultTypeFactory
+{
+ public Ant1TypeFactory( final URL url )
+ {
+ super( url );
+ }
+
+ public Ant1TypeFactory( final URL[] urls )
+ {
+ super( urls );
+ }
+
+ public Ant1TypeFactory( final URL[] urls, final ClassLoader parent )
+ {
+ super( urls, parent );
+ }
+
+ public Ant1TypeFactory( final ClassLoader classLoader )
+ {
+ super( classLoader );
+ }
+
+ public Object create( final String name )
+ throws TypeException
+ {
+ final Object object = super.create( name );
+
+ if( !(object instanceof Task) )
+ {
+ throw new TypeException( "Expected an Ant1 task but received an " +
+ "object of type : " + object.getClass().getName() );
+ }
+
+ return new TaskAdapter( (Task)object );
+ }
+}
+
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/TaskAdapter.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/TaskAdapter.java
new file mode 100644
index 000000000..b73dd5ac8
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/TaskAdapter.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.myrmidon.libs.ant1;
+
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.myrmidon.api.DataType;
+import org.apache.myrmidon.api.TaskContext;
+import org.apache.myrmidon.api.TaskException;
+import org.apache.myrmidon.components.type.TypeException;
+import org.apache.myrmidon.components.type.TypeFactory;
+import org.apache.myrmidon.components.type.TypeManager;
+import org.apache.myrmidon.framework.AbstractContainerTask;
+import org.apache.tools.ant.Task;
+
+/**
+ * Adapter of Ant1 tasks to ant2.
+ *
+ * @author Peter Donald
+ */
+public class TaskAdapter
+ extends AbstractContainerTask
+ implements Configurable
+{
+ private Task m_ant1Task;
+ private Ant1Project m_project = new Ant1Project();
+
+ public TaskAdapter( final Task ant1Task )
+ {
+ m_ant1Task = ant1Task;
+ }
+
+ protected final Task getTask()
+ {
+ return m_ant1Task;
+ }
+
+ protected final Ant1Project getProject()
+ {
+ return m_project;
+ }
+
+ public void configure( final Configuration configuration )
+ throws ConfigurationException
+ {
+ getTask().setTaskName( configuration.getName() );
+
+ //do configuration
+ configure( getTask(), configuration );
+ }
+
+ public void execute()
+ throws TaskException
+ {
+ try
+ {
+ getProject().setLogger( getLogger() );
+ getProject().contextualize( getContext() );
+ getProject().init();
+
+ getTask().setProject( getProject() );
+ getTask().init();
+ getTask().execute();
+ }
+ catch( final Exception e )
+ {
+ throw new TaskException( e.getMessage(), e );
+ }
+ }
+}