diff --git a/proposal/myrmidon/src/java/org/apache/aut/converter/AbstractConverter.java b/proposal/myrmidon/src/java/org/apache/aut/converter/AbstractConverter.java
new file mode 100644
index 000000000..038c81e52
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/aut/converter/AbstractConverter.java
@@ -0,0 +1,83 @@
+/*
+ * 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.txt file.
+ */
+package org.apache.aut.converter;
+
+import java.util.Map;
+import org.apache.avalon.excalibur.i18n.ResourceManager;
+import org.apache.avalon.excalibur.i18n.Resources;
+
+/**
+ * Instances of this interface are used to convert between different types.
+ *
+ * @author Peter Donald
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractConverter
+ implements Converter
+{
+ private final static Resources REZ =
+ ResourceManager.getPackageResources( AbstractConverter.class );
+
+ private final Class m_source;
+ private final Class m_destination;
+
+ /**
+ * Constructor for a converter between types source and destination
+ *
+ * @param source the source type
+ * @param destination the destination type
+ */
+ public AbstractConverter( final Class source, final Class destination )
+ {
+ m_source = source;
+ m_destination = destination;
+ }
+
+ /**
+ * Convert an object from original to destination types
+ *
+ * @param destination the destination type
+ * @param original the original Object
+ * @param context the context in which to convert
+ * @return the converted object
+ * @exception ConverterException if an error occurs
+ */
+ public Object convert( final Class destination,
+ final Object original,
+ final Map context )
+ throws ConverterException
+ {
+ if( m_destination != destination )
+ {
+ final String message =
+ REZ.getString( "bad-destination.error", destination.getName(), m_destination );
+ throw new IllegalArgumentException( message );
+ }
+
+ if( !m_source.isInstance( original ) )
+ {
+ final String message =
+ REZ.getString( "bad-instance.error", original, m_source.getName() );
+ throw new IllegalArgumentException( message );
+ }
+
+ return convert( original, context );
+ }
+
+ /**
+ * Overide this in a particular converter to do the conversion.
+ *
+ * @param original the original Object
+ * @param context the context in which to convert
+ * @return the converted object
+ * @exception ConverterException if an error occurs
+ */
+ protected abstract Object convert( Object original, Map context )
+ throws ConverterException;
+}
+
diff --git a/proposal/myrmidon/src/java/org/apache/aut/converter/Converter.java b/proposal/myrmidon/src/java/org/apache/aut/converter/Converter.java
new file mode 100644
index 000000000..166da6c50
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/aut/converter/Converter.java
@@ -0,0 +1,37 @@
+/*
+ * 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.txt file.
+ */
+package org.apache.aut.converter;
+
+import org.apache.avalon.framework.context.Context;
+import java.util.Map;
+
+/**
+ * Instances of this interface are used to convert between different types.
+ *
+ * @author Peter Donald
+ * @version $Revision$ $Date$
+ * @ant:role shorthand="converter"
+ */
+public interface Converter
+{
+ String ROLE = Converter.class.getName();
+
+ /**
+ * Convert original to destination type.
+ * Destination is passed so that one converter can potentiall
+ * convert to multiple different types.
+ *
+ * @param destination the destinaiton type
+ * @param original the original type
+ * @param context the context in which to convert
+ * @return the converted object
+ * @exception ConverterException if an error occurs
+ */
+ Object convert( Class destination, Object original, Map context )
+ throws ConverterException;
+}
diff --git a/proposal/myrmidon/src/java/org/apache/aut/converter/ConverterException.java b/proposal/myrmidon/src/java/org/apache/aut/converter/ConverterException.java
new file mode 100644
index 000000000..e483cfbeb
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/aut/converter/ConverterException.java
@@ -0,0 +1,42 @@
+/*
+ * 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.txt file.
+ */
+package org.apache.aut.converter;
+
+import org.apache.avalon.framework.CascadingException;
+
+/**
+ * ConverterException thrown when a problem occurs during convertion etc.
+ *
+ * @author Peter Donald
+ * @version $Revision$ $Date$
+ */
+public class ConverterException
+ extends CascadingException
+{
+ /**
+ * Basic constructor with a message
+ *
+ * @param message the message
+ */
+ public ConverterException( final String message )
+ {
+ this( message, null );
+ }
+
+ /**
+ * Constructor that builds cascade so that other exception information can be retained.
+ *
+ * @param message the message
+ * @param throwable the throwable
+ */
+ public ConverterException( final String message, final Throwable throwable )
+ {
+ super( message, throwable );
+ }
+}
+
diff --git a/proposal/myrmidon/src/java/org/apache/aut/converter/Resources.properties b/proposal/myrmidon/src/java/org/apache/aut/converter/Resources.properties
new file mode 100644
index 000000000..d912151b4
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/aut/converter/Resources.properties
@@ -0,0 +1,2 @@
+bad-destination.error=Destination type ({0}) is not equal to {1}.
+bad-instance.error=Object {0} is not an instance of {1}.