diff --git a/modules/jdktools/META-INF/MANIFEST.MF b/modules/jdktools/META-INF/MANIFEST.MF
index 4901ef5..3cb4962 100644
--- a/modules/jdktools/META-INF/MANIFEST.MF
+++ b/modules/jdktools/META-INF/MANIFEST.MF
@@ -4,7 +4,8 @@
 Implementation-Title: Apache Harmony
 Implementation-Vendor: The Apache Software Foundation
 Implementation-Vendor-Id: org.apache.harmony
-Implementation-URL: http://incubator.apache.org/harmony
+Implementation-URL: http://harmony.apache.org
+Class-Path: ecj-3.4.2.jar,jdi.jar,jdimodel.jar,bcel-5.2.jar
 Bundle-ManifestVersion: 2
 Bundle-Name: Harmony Tools
 Bundle-SymbolicName: org.apache.harmony.tools
@@ -28,21 +29,21 @@
  org.apache.harmony.kernel.vm,
  org.apache.harmony.luni.util,
  org.apache.harmony.pack200,
- org.apache.harmony.security.asn1;version="1.0.0",
- org.apache.harmony.security.pkcs10;version="1.0.0",
- org.apache.harmony.security.provider.cert;version="1.0.0",
- org.apache.harmony.security.utils;version="1.0.0",
- org.apache.harmony.security.x501;version="1.0.0",
- org.apache.harmony.security.x509;version="1.0.0"
+ org.apache.harmony.rmi.activation,
+ org.apache.harmony.rmi.compiler,
+ org.apache.harmony.rmi.registry,
+ org.apache.harmony.security.asn1,
+ org.apache.harmony.security.pkcs10,
+ org.apache.harmony.security.pkcs7,
+ org.apache.harmony.security.provider.cert,
+ org.apache.harmony.security.utils,
+ org.apache.harmony.security.x501,
+ org.apache.harmony.security.x509,
+ org.apache.harmony.security.x509.tsp
 Export-Package: org.apache.harmony.tools.javac,
  org.apache.harmony.tools.javah,
  org.apache.harmony.tools.javadoc,
  org.apache.harmony.tools.jarsigner,
  org.apache.harmony.tools.keytool,
- org.apache.harmony.tools.unpack200,
- org.apache.harmony.tools.pack200,
  com.sun.tools.javac,
- com.sun.tools.jdi,
- com.sun.tools.jdi.connect,
- com.sun.tools.jdi.event,
- com.sun.tools.jdi.request
+ com.sun.jdi
diff --git a/modules/jdktools/build.xml b/modules/jdktools/build.xml
index b33c515..dd92c9b 100644
--- a/modules/jdktools/build.xml
+++ b/modules/jdktools/build.xml
@@ -48,6 +48,7 @@
         <check-one-file src="${jdt.jdimodel.jar.url}"
                         dest="${jdt.jdimodel.jar}" />
         <check-one-file src="${icu.url}" dest="${icu.jar}" />
+        <check-one-file src="${ecj.jar.url}" dest="${ecj.jar}" />
     </target>
     
     <target name="fetch-depends">
@@ -109,6 +110,7 @@
 
             <classpath>
                 <pathelement path="${jdt.jdi.jar}"/>
+                <pathelement path="${ecj.jar}" />
             </classpath>
         </hy.javac>
     </target>
diff --git a/modules/jdktools/src/main/java/org/apache/harmony/tools/javac/Compiler.java b/modules/jdktools/src/main/java/org/apache/harmony/tools/javac/Compiler.java
deleted file mode 100644
index 582fbd6..0000000
--- a/modules/jdktools/src/main/java/org/apache/harmony/tools/javac/Compiler.java
+++ /dev/null
@@ -1,233 +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.
- */
-
-package org.apache.harmony.tools.javac;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import org.apache.harmony.tools.toolutils.Util;
-
-/**
- * A proxy to the Java source code compiler itself.
- */
-class Compiler {
-
-    /* FIXME: Hard-coded for now, the name of the ECJ JAR file */
-    static final String ECJ_JAR_FILE = "ecj-3.4.2.jar"; //$NON-NLS-1$
-
-    static final String TOOLS_JAR_FILE = "tools.jar"; //$NON-NLS-1$
-
-    /* The name of the ECJ compiler class */
-    static final String MAIN_CLASS_NAME = "org.eclipse.jdt.internal.compiler.batch.Main"; //$NON-NLS-1$
-
-    /*
-     * Invokes the compiler with the given command-line arguments. The supported
-     * arguments can be determined form the usage message.
-     * 
-     * Answers the result of the compilation from ECJ; i.e. true if the compile
-     * succeeded, and false otherwise.
-     */
-    public static boolean main(String[] args) {
-        return main(args, Util.getDefaultWriter(System.out), Util.getDefaultWriter(System.err));
-    }
-
-    public static boolean main(String[] args, PrintWriter out, PrintWriter err) {
-        Compiler myself = new Compiler(out, err);
-
-        // If there is a problem invoking the method, simply dump the trace for
-        // now
-        try {
-            Object result = myself.staticCompileMth.invoke(myself.mainInst,
-                    new Object[] { args });
-            return (Boolean) result;
-        } catch (IllegalArgumentException e) {
-            e.printStackTrace();
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        } catch (InvocationTargetException e) {
-            e.printStackTrace();
-        }
-        return false;
-    }
-
-    // Reference to ECJ 'Main' compiler class.
-    Class<?> ecjCompilerClass;
-
-    // An instance of the ECJ compiler
-    Object mainInst;
-
-    // The Main#printUsage() method.
-    Method printUsageMth;
-
-    // The static Main#compile(string[]) method on the ECJ compiler
-    Method staticCompileMth;
-
-    /**
-     * Default constructor. Returns a new initialized instance of the Java
-     * compiler.
-     */
-    public Compiler(PrintWriter out, PrintWriter err) {
-        super();
-        initialize(out, err);
-    }
-
-    /*
-     * Initialize our local variables. Called during type construction.
-     */
-    protected void initialize(PrintWriter out, PrintWriter err) {
-        try {
-            initializeMainClass();
-            initializeInstance(out, err);
-            initializeMethods();
-        } catch (Exception e) {
-            // If there is a problem we log it to the console
-            e.printStackTrace();
-        }
-    }
-
-    /*
-     * Defines the local instance of the ECJ compiler
-     */
-    protected void initializeInstance(PrintWriter out, PrintWriter err) throws SecurityException,
-            NoSuchMethodException, IllegalArgumentException,
-            InstantiationException, IllegalAccessException,
-            InvocationTargetException {
-
-        // Create a new instance of the compiler
-        Constructor<?> ctor = ecjCompilerClass.getConstructor(new Class[] {
-                PrintWriter.class, PrintWriter.class, Boolean.TYPE });
-
-        mainInst = ctor.newInstance(new Object[] { out, err,
-                Boolean.FALSE });
-    }
-
-    /*
-     * Defines the compiler class from the ECJ jar file
-     */
-    protected void initializeMainClass() throws ClassNotFoundException,
-            SecurityException, NoSuchMethodException, MalformedURLException,
-            IllegalArgumentException, InstantiationException,
-            IllegalAccessException, InvocationTargetException {
-
-        // Find the ECJ JAR file, prefer those found near loaders
-        URL ecjURL = searchLoaders();
-        if (ecjURL == null) {
-            ecjURL = searchPaths();
-        }
-        if (ecjURL == null) {
-            throw new RuntimeException("Cannot find file " + ECJ_JAR_FILE);
-        }
-
-        // Load the ECJ main class
-        URLClassLoader loader = new URLClassLoader(new URL[] { ecjURL });
-        ecjCompilerClass = loader.loadClass(MAIN_CLASS_NAME);
-    }
-
-    /*
-     * Looks for the ECJ JAR file in the current working directory, and in the
-     * jdk/lib of the current runtime. Answers with a URL of the JAR file if
-     * found, or null if not found.
-     */
-    private URL searchPaths() throws MalformedURLException {
-        // Search in current working directory
-        File cwdFile = new File(ECJ_JAR_FILE);
-        if (cwdFile.exists()) {
-            return cwdFile.toURL();
-        }
-
-        // Look for it via the java.home
-        File javaHomeFile = new File(System.getProperty("java.home")); //$NON-NLS-1$
-        String pathFromJDK = "lib" + File.separator + ECJ_JAR_FILE; //$NON-NLS-1$
-
-        // Is java.home pointing at a JDK?
-        File jdkBasedFile = new File(javaHomeFile, pathFromJDK);
-        if (jdkBasedFile.exists()) {
-            return jdkBasedFile.toURL();
-        }
-        // Maybe it is pointing at a JRE.
-        File jdkHomeFile = javaHomeFile.getParentFile();
-        if (jdkHomeFile == null) {
-            return null;
-        }
-        File jreBasedFile = new File(jdkHomeFile, pathFromJDK);
-        if (jreBasedFile.exists()) {
-            return jreBasedFile.toURL();
-        }
-
-        // We didn't find it
-        return null;
-    }
-
-    /*
-     * Find the ECJ jar by searching for the tools.jar location and figuring
-     * that it is alongside that.
-     */
-    private URL searchLoaders() throws MalformedURLException {
-        URLClassLoader bogusLoader = new URLClassLoader(new URL[] {});
-        ClassLoader parentLoader = bogusLoader.getParent();
-        while (parentLoader instanceof URLClassLoader) {
-            URLClassLoader parentURLLoader = (URLClassLoader) parentLoader;
-            URL[] uls = parentURLLoader.getURLs();
-            for (int i = 0; i < uls.length; i++) {
-                URL l = uls[i];
-                String filename = new File(l.getFile()).getName();
-                if (filename.equals(TOOLS_JAR_FILE)) {
-                    return new URL(l, ECJ_JAR_FILE);
-                }
-            }
-            // Not found here, move up a level
-            parentLoader = parentLoader.getParent();
-        }
-        // We didn't find it
-        return null;
-    }
-
-    /*
-     * Initialize our local references to compiler methods we may wish to
-     * invoke.
-     */
-    protected void initializeMethods() throws SecurityException,
-            NoSuchMethodException {
-        staticCompileMth = ecjCompilerClass.getMethod("compile", //$NON-NLS-1$
-                new Class[] { String[].class });
-        printUsageMth = ecjCompilerClass
-                .getMethod("printUsage", (Class[]) null); //$NON-NLS-1$
-    }
-
-    /**
-     * Prints the compiler usage message out on the console.
-     */
-    public void printUsage() {
-        // If there is a problem invoking the method, simply dump the trace for
-        // now
-        try {
-            printUsageMth.invoke(mainInst);
-        } catch (IllegalArgumentException e) {
-            e.printStackTrace();
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        } catch (InvocationTargetException e) {
-            e.printStackTrace();
-        }
-    }
-}
diff --git a/modules/jdktools/src/main/java/org/apache/harmony/tools/javac/Main.java b/modules/jdktools/src/main/java/org/apache/harmony/tools/javac/Main.java
index 0b1b3b5..26a9f19 100644
--- a/modules/jdktools/src/main/java/org/apache/harmony/tools/javac/Main.java
+++ b/modules/jdktools/src/main/java/org/apache/harmony/tools/javac/Main.java
@@ -17,9 +17,11 @@
 
 package org.apache.harmony.tools.javac;
 
-import java.io.PrintWriter;
 import java.io.File;
+import java.io.PrintWriter;
+
 import org.apache.harmony.tools.toolutils.Util;
+import org.eclipse.jdt.core.compiler.batch.BatchCompiler;
 
 /**
  * This is the entry point for the javac tool.
@@ -54,8 +56,9 @@
      * @return a return code as defined by this class
      */
     public int compile(String[] args) {
-
-        return compile(args,Util.getDefaultWriter(System.out), Util.getDefaultWriter(System.err));
+        return compile(args,
+                Util.getDefaultWriter(System.out),
+                Util.getDefaultWriter(System.err));
     }
 
     /**
@@ -71,17 +74,17 @@
      */
     public int compile(String[] args, PrintWriter out, PrintWriter err) {
 
-        /* Give me something to do */
+        /* Give me something to do, or print usage message */
         if (args == null || args.length == 0) {
-            new Compiler(out, err).printUsage();
+            BatchCompiler.compile("-help", out, err, null); //$NON-NLS-1$
             return RC_USAGE_ERROR;
         }
 
         /* Add in the base class library code to compile against */
-        String[] newArgs = addBootclasspath(args);
+        String[] newArgs = addLocalArgs(args);
 
         /* Invoke the compiler */
-        boolean success = Compiler.main(newArgs, out, err);
+        boolean success = BatchCompiler.compile(newArgs, out, err, null);
         return success ? RC_SUCCESS : RC_COMPILE_ERROR;
     }
 
@@ -89,20 +92,20 @@
      * Set up the compiler option to compile against the running JRE class
      * libraries.
      */
-    private String[] addBootclasspath(String[] args) {
+    private String[] addLocalArgs(String[] args) {
         StringBuilder sb = new StringBuilder();
-        String[] result = new String[args.length + 2];
+        String[] result = new String[args.length + 3];
 
         System.arraycopy(args, 0, result, 0, args.length);
         result[args.length] = "-classpath"; //$NON-NLS-1$
         sb.append(System.getProperty(
-                 "org.apache.harmony.boot.class.path", ".")); //$NON-NLS-1$ //$NON-NLS-2$
+                        "org.apache.harmony.boot.class.path", ".")); //$NON-NLS-1$ //$NON-NLS-2$
         sb.append(File.pathSeparator);
-        sb.append(System.getProperty(
-                 "sun.boot.class.path", ".")); //$NON-NLS-1$ //$NON-NLS-2$
+        sb.append(System.getProperty("sun.boot.class.path", ".")); //$NON-NLS-1$ //$NON-NLS-2$
         sb.append(File.pathSeparator);
         sb.append("."); //$NON-NLS-1$
         result[args.length + 1] = sb.toString();
+        result[args.length + 2] = "-1.5"; //$NON-NLS-1$
         return result;
     }
 }
