diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec/launchers/PerlCommandLauncher.java b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec/launchers/PerlCommandLauncher.java
new file mode 100644
index 000000000..16d4992c3
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec/launchers/PerlCommandLauncher.java
@@ -0,0 +1,55 @@
+/*
+ * 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.myrmidon.framework.exec.launchers;
+
+import java.io.IOException;
+import java.io.File;
+import org.apache.myrmidon.api.TaskException;
+import org.apache.myrmidon.framework.exec.CommandLauncher;
+import org.apache.myrmidon.framework.exec.ExecMetaData;
+import org.apache.avalon.excalibur.io.FileUtil;
+
+/**
+ * A command launcher that uses an auxiliary script to launch commands in
+ * directories other than the current working directory.
+ *
+ * @author Peter Donald
+ * @author Thomas Haas
+ * @version $Revision$ $Date$
+ */
+public class PerlCommandLauncher
+ implements CommandLauncher
+{
+ private String m_script;
+
+ public PerlCommandLauncher( final String script )
+ {
+ m_script = script;
+ }
+
+ /**
+ * Launches the given command in a new process using cmd.exe to
+ * set the working directory.
+ */
+ public Process exec( final ExecMetaData metaData )
+ throws IOException, TaskException
+ {
+ final File homeDir = ExecUtil.getAntHomeDirectory();
+ final String script = FileUtil.resolveFile( homeDir, m_script ).toString();
+
+ // Build the command
+ final String[] prefix = new String[ 3 ];
+ prefix[ 0 ] = "perl";
+ prefix[ 1 ] = script;
+ prefix[ 2 ] = metaData.getWorkingDirectory().getCanonicalPath();
+
+ final ExecMetaData newMetaData = ExecUtil.prepend( metaData, prefix );
+ return Runtime.getRuntime().
+ exec( newMetaData.getCommand(), newMetaData.getEnvironment() );
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec/launchers/ScriptCommandLauncher.java b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec/launchers/ScriptCommandLauncher.java
new file mode 100644
index 000000000..81ff04dfb
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec/launchers/ScriptCommandLauncher.java
@@ -0,0 +1,54 @@
+/*
+ * 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.myrmidon.framework.exec.launchers;
+
+import java.io.IOException;
+import java.io.File;
+import org.apache.myrmidon.api.TaskException;
+import org.apache.myrmidon.framework.exec.CommandLauncher;
+import org.apache.myrmidon.framework.exec.ExecMetaData;
+import org.apache.avalon.excalibur.io.FileUtil;
+
+/**
+ * A command launcher that uses an auxiliary script to launch commands in
+ * directories other than the current working directory.
+ *
+ * @author Peter Donald
+ * @author Thomas Haas
+ * @version $Revision$ $Date$
+ */
+public class ScriptCommandLauncher
+ implements CommandLauncher
+{
+ private String m_script;
+
+ public ScriptCommandLauncher( final String script )
+ {
+ m_script = script;
+ }
+
+ /**
+ * Launches the given command in a new process using cmd.exe to
+ * set the working directory.
+ */
+ public Process exec( final ExecMetaData metaData )
+ throws IOException, TaskException
+ {
+ final File homeDir = ExecUtil.getAntHomeDirectory();
+ final String script = FileUtil.resolveFile( homeDir, m_script ).toString();
+
+ // Build the command
+ final String[] prefix = new String[ 2 ];
+ prefix[ 0 ] = script;
+ prefix[ 1 ] = metaData.getWorkingDirectory().getCanonicalPath();
+
+ final ExecMetaData newMetaData = ExecUtil.prepend( metaData, prefix );
+ return Runtime.getRuntime().
+ exec( newMetaData.getCommand(), newMetaData.getEnvironment() );
+ }
+}