changeset 2385:f04fccfbd880 jdk9-b11

Merge
author lana
date Thu, 24 Apr 2014 16:04:44 -0700
parents cc804e190c8c 176a2e871eb9
children 55e92b74c283 5828c0ddbb04
files make/netbeans/langtools/nbproject/standard-context-menu-items.ent make/netbeans/langtools/nbproject/standard-ide-actions.ent test/tools/javac/lambda/ErroneousLambdaExpr.java test/tools/javac/lambda/ErroneousLambdaExpr.out
diffstat 215 files changed, 5042 insertions(+), 5272 deletions(-) [+]
line wrap: on
line diff
--- a/make/netbeans/langtools/build.xml	Thu Apr 24 12:21:18 2014 -0700
+++ b/make/netbeans/langtools/build.xml	Thu Apr 24 16:04:44 2014 -0700
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
- Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
 
  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
@@ -136,11 +136,32 @@
         </antcall>
     </target>
 
-    <target name="-show-jtreg" if="netbeans.home" unless="jtreg.passed">
-        <nbbrowse file="${jtreg.report}/report.html"/>
+    <target name="-show-jtreg-single-detect" if="netbeans.home" unless="jtreg.passed">
+        <dirname property="netbeans.jtreg.tests.dir.temp" file="${jtreg.report}/../work/${jtreg.tests}"/>
+        <basename property="netbeans.jtreg.tests.basename.temp" file="${jtreg.tests}" suffix=".java"/>
+        <property name="netbeans.jtreg.single.jtr" value="${netbeans.jtreg.tests.dir.temp}/${netbeans.jtreg.tests.basename.temp}.jtr"/>
+        <condition property="netbeans.jtreg.single">
+            <available file="${netbeans.jtreg.single.jtr}" />
+        </condition>
+        <condition property="netbeans.jtreg.multiple">
+            <not>
+                <available file="${netbeans.jtreg.single.jtr}" />
+            </not>
+        </condition>
+    </target>
+
+    <target name="-show-jtreg-single" if="netbeans.jtreg.single" depends="-show-jtreg-single-detect">
+        <nbbrowse file="${netbeans.jtreg.single.jtr}"/>
         <fail>Some tests failed; see report for details.</fail>
     </target>
 
+    <target name="-show-jtreg-multiple" if="netbeans.jtreg.multiple" depends="-show-jtreg-single-detect">
+        <nbbrowse url="file://${jtreg.report}/html/report.html#Results"/>
+        <fail>Some tests failed; see report for details.</fail>
+    </target>
+
+    <target name="-show-jtreg" depends="-show-jtreg-single-detect,-show-jtreg-single,-show-jtreg-multiple" />
+
     <!-- Debug tool in NetBeans. -->
 
     <target name="debug" depends="-check-target.java.home,-def-run,-def-start-debugger,-get-tool-and-args,build" if="netbeans.home">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/langtools/nbproject/project.properties	Thu Apr 24 16:04:44 2014 -0700
@@ -0,0 +1,10 @@
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=4
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=4
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=100
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
+auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importGroupsOrder=java;javax;*;static java;static javax;static *
+auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importInnerClasses=true
+auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.separateStaticImports=true
--- a/make/netbeans/langtools/nbproject/project.xml	Thu Apr 24 12:21:18 2014 -0700
+++ b/make/netbeans/langtools/nbproject/project.xml	Thu Apr 24 16:04:44 2014 -0700
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
- Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
 
  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
@@ -67,38 +67,7 @@
             </folders>
             <ide-actions>
                 <!--
- Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
-   - Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-
-   - Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in the
-     documentation and/or other materials provided with the distribution.
-
-   - Neither the name of Oracle nor the names of its
-     contributors may be used to endorse or promote products derived
-     from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-                <!--
- This file defines the standard actions accepted by langtools projects.
- It is normally included as an entity into a project's project.xml file.
+ This section defines the standard actions accepted by langtools projects.
 
  For information on these actions, see
    - NetBeans: Setting Up Projects
@@ -156,7 +125,7 @@
                         <pattern>\.(java|sh)$</pattern>
                         <format>relative-path</format>
                         <arity>
-                            <separated-files>,</separated-files>
+                            <separated-files> </separated-files>
                         </arity>
                     </context>
                 </action>
@@ -246,39 +215,8 @@
                 </items>
                 <context-menu>
                     <!--
- Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
-   - Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-
-   - Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in the
-     documentation and/or other materials provided with the distribution.
-
-   - Neither the name of Oracle nor the names of its
-     contributors may be used to endorse or promote products derived
-     from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-                    <!--
- This file defines the actions that will appear on the project's context
+ This section defines the actions that will appear on the project's context
  menu, in the Projects viewer.
- It is normally included as an entity into a project's project.xml file.
 
  For information on these actions, see
    - NetBeans: Setting Up Projects
--- a/make/netbeans/langtools/nbproject/standard-context-menu-items.ent	Thu Apr 24 12:21:18 2014 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
-   - Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-
-   - Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in the
-     documentation and/or other materials provided with the distribution.
-
-   - Neither the name of Oracle nor the names of its
-     contributors may be used to endorse or promote products derived
-     from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-
-<!-- 
- This file defines the actions that will appear on the project's context
- menu, in the Projects viewer.
- It is normally included as an entity into a project's project.xml file.
-
- For information on these actions, see
-   - NetBeans: Setting Up Projects
-     at http://www.netbeans.org/kb/55/using-netbeans/project_setup.html
-   - NetBeans: Advanced Freeform Project Configuration
-     at http://www.netbeans.org/kb/41/freeform-config.html 
--->
-
-<ide-action name="select-tool"/>
-
-<separator/>
-  
-<ide-action name="build"/>
-<ide-action name="rebuild"/>
-<ide-action name="clean"/>
-<ide-action name="javadoc"/>
-
-<separator/>
-
-<ide-action name="run"/>
-<ide-action name="debug"/>
-
-<separator/>
-
-<ide-action name="test"/>
--- a/make/netbeans/langtools/nbproject/standard-ide-actions.ent	Thu Apr 24 12:21:18 2014 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
-   - Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-
-   - Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in the
-     documentation and/or other materials provided with the distribution.
-
-   - Neither the name of Oracle nor the names of its
-     contributors may be used to endorse or promote products derived
-     from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-
-<!-- 
- This file defines the standard actions accepted by langtools projects.
- It is normally included as an entity into a project's project.xml file.
-
- For information on these actions, see
-   - NetBeans: Setting Up Projects
-     at http://www.netbeans.org/kb/55/using-netbeans/project_setup.html
-   - NetBeans: Advanced Freeform Project Configuration
-     at http://www.netbeans.org/kb/41/freeform-config.html 
--->
-
-<action name="build">
-    <target>build</target>
-</action>
-
-<action name="clean">
-    <target>clean</target>
-</action>
-
-<action name="rebuild">
-    <target>clean</target>
-    <target>build</target>
-</action>
-
-<action name="compile.single">
-    <target>compile-single</target>
-    <property name="srcdir">${root}/src/share/classes</property>
-    <context>
-        <property>includes</property>
-        <folder>${root}/src/share/classes</folder>
-        <pattern>\.java$</pattern>
-        <format>relative-path</format>
-        <arity>
-            <separated-files>,</separated-files>
-        </arity>
-    </context>
-</action>
-
-<action name="run">
-    <target>run</target>
-</action>
-
-<action name="run.single">
-    <target>run-single</target>
-    <context>
-        <property>run.classname</property>
-        <folder>${root}/src/share/classes</folder>
-        <pattern>\.java$</pattern>
-        <format>java-name</format>
-        <arity>
-            <one-file-only/>
-        </arity>
-    </context>
-</action>
-
-<!-- 
- Note: NetBeans does not appear to support context menu items
- on shell scripts :-(
--->
-
-<action name="run.single">
-    <target>jtreg</target>
-    <context>
-        <property>jtreg.tests</property>
-        <folder>${root}/test</folder>
-        <pattern>\.(java|sh)$</pattern>
-        <format>relative-path</format>
-        <arity>
-            <separated-files>,</separated-files>
-        </arity>
-    </context>
-</action>
-
-<action name="test">
-    <target>jtreg</target>
-</action>
-
-<action name="debug">
-    <target>debug</target>
-</action>
-
-<action name="debug.single">
-    <target>debug-single</target>
-    <context>
-        <property>debug.classname</property>
-        <folder>${root}/src/share/classes</folder>
-        <pattern>\.java$</pattern>
-        <format>java-name</format>
-        <arity>
-            <one-file-only/>
-        </arity>
-    </context>
-</action>
-
-<!-- 
- Note: NetBeans does not appear to support context menu items
- on shell scripts :-(
--->
-
-<action name="debug.single">
-    <target>debug-jtreg</target>
-    <context>
-        <property>jtreg.tests</property>
-        <folder>${root}/test</folder>
-        <pattern>\.(java|sh)$</pattern>
-        <format>relative-path</format>
-        <arity>
-            <one-file-only/>
-        </arity>
-    </context>
-</action>
-
-<action name="debug.fix">
-    <target>debug-fix</target>
-    <property name="srcdir">${root}/src/share/classes</property>
-    <context>
-        <property>class</property>
-        <folder>${root}/src/share/classes</folder>
-        <pattern>\.java$</pattern>
-        <format>relative-path-noext</format>
-        <arity>
-            <one-file-only/>
-        </arity>
-    </context>
-</action>
-
-<action name="javadoc">
-    <target>javadoc</target>
-</action>
-
-<action name="select-tool">
-    <target>select-tool</target>
-</action>
-
-<action name="test-select-tool-1">
-    <target>test-select-tool-1</target>
-</action>
-
-<action name="test-select-tool-2">
-    <target>test-select-tool-2</target>
-</action>
--- a/make/tools/genstubs/GenStubs.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/make/tools/genstubs/GenStubs.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -316,7 +316,8 @@
                 }
                 defs.add(def);
             }
-            return m.TopLevel(tree.packageAnnotations, tree.pid, defs.toList());
+            tree.defs = tree.defs.intersect(defs.toList());
+            return tree;
         }
 
         @Override
--- a/src/share/classes/com/sun/source/tree/CompilationUnitTree.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/source/tree/CompilationUnitTree.java	Thu Apr 24 16:04:44 2014 -0700
@@ -41,6 +41,12 @@
 public interface CompilationUnitTree extends Tree {
     List<? extends AnnotationTree> getPackageAnnotations();
     ExpressionTree getPackageName();
+
+    /**
+     * Return the PackageTree associated with this compilation unit.
+     * @since 1.9
+     */
+    PackageTree getPackage();
     List<? extends ImportTree> getImports();
     List<? extends Tree> getTypeDecls();
     JavaFileObject getSourceFile();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/source/tree/PackageTree.java	Thu Apr 24 16:04:44 2014 -0700
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.source.tree;
+
+import java.util.List;
+
+/**
+ * Represents the package declaration.
+ *
+ * @jls sections 7.3, and 7.4
+ *
+ * @author Paul Govereau
+ * @since 1.9
+ */
+@jdk.Exported
+public interface PackageTree extends Tree {
+    List<? extends AnnotationTree> getAnnotations();
+    ExpressionTree getPackageName();
+}
--- a/src/share/classes/com/sun/source/tree/Tree.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/source/tree/Tree.java	Thu Apr 24 16:04:44 2014 -0700
@@ -208,6 +208,12 @@
         LAMBDA_EXPRESSION(LambdaExpressionTree.class),
 
         /**
+         * Used for instances of {@link PackageTree}.
+         * @since 1.9
+         */
+        PACKAGE(PackageTree.class),
+
+        /**
          * Used for instances of {@link ParenthesizedTree}.
          */
         PARENTHESIZED(ParenthesizedTree.class),
--- a/src/share/classes/com/sun/source/tree/TreeVisitor.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/source/tree/TreeVisitor.java	Thu Apr 24 16:04:44 2014 -0700
@@ -88,6 +88,7 @@
     R visitNewArray(NewArrayTree node, P p);
     R visitNewClass(NewClassTree node, P p);
     R visitLambdaExpression(LambdaExpressionTree node, P p);
+    R visitPackage(PackageTree node, P p);
     R visitParenthesized(ParenthesizedTree node, P p);
     R visitReturn(ReturnTree node, P p);
     R visitMemberSelect(MemberSelectTree node, P p);
--- a/src/share/classes/com/sun/source/util/SimpleTreeVisitor.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/source/util/SimpleTreeVisitor.java	Thu Apr 24 16:04:44 2014 -0700
@@ -65,6 +65,10 @@
         return defaultAction(node, p);
     }
 
+    public R visitPackage(PackageTree node, P p) {
+        return defaultAction(node, p);
+    }
+
     public R visitImport(ImportTree node, P p) {
         return defaultAction(node, p);
     }
--- a/src/share/classes/com/sun/source/util/TreeScanner.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/source/util/TreeScanner.java	Thu Apr 24 16:04:44 2014 -0700
@@ -114,13 +114,18 @@
  ****************************************************************************/
 
     public R visitCompilationUnit(CompilationUnitTree node, P p) {
-        R r = scan(node.getPackageAnnotations(), p);
-        r = scanAndReduce(node.getPackageName(), p, r);
+        R r = scan(node.getPackage(), p);
         r = scanAndReduce(node.getImports(), p, r);
         r = scanAndReduce(node.getTypeDecls(), p, r);
         return r;
     }
 
+    public R visitPackage(PackageTree node, P p) {
+        R r = scan(node.getAnnotations(), p);
+        r = scanAndReduce(node.getPackageName(), p, r);
+        return r;
+    }
+
     public R visitImport(ImportTree node, P p) {
         return scan(node.getQualifiedIdentifier(), p);
     }
--- a/src/share/classes/com/sun/tools/doclint/Checker.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/doclint/Checker.java	Thu Apr 24 16:04:44 2014 -0700
@@ -75,6 +75,7 @@
 import com.sun.source.doctree.UnknownInlineTagTree;
 import com.sun.source.doctree.ValueTree;
 import com.sun.source.doctree.VersionTree;
+import com.sun.source.tree.Tree;
 import com.sun.source.util.DocTreePath;
 import com.sun.source.util.DocTreePathScanner;
 import com.sun.source.util.TreePath;
@@ -145,8 +146,8 @@
 
         boolean isOverridingMethod = !env.currOverriddenMethods.isEmpty();
 
-        if (p.getLeaf() == p.getCompilationUnit()) {
-            // If p points to a compilation unit, the implied declaration is the
+        if (p.getLeaf().getKind() == Tree.Kind.PACKAGE) {
+            // If p points to a package, the implied declaration is the
             // package declaration (if any) for the compilation unit.
             // Handle this case specially, because doc comments are only
             // expected in package-info files.
--- a/src/share/classes/com/sun/tools/doclint/DocLint.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/doclint/DocLint.java	Thu Apr 24 16:04:44 2014 -0700
@@ -42,6 +42,7 @@
 import com.sun.source.doctree.DocCommentTree;
 import com.sun.source.tree.ClassTree;
 import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.PackageTree;
 import com.sun.source.tree.MethodTree;
 import com.sun.source.tree.Tree;
 import com.sun.source.tree.VariableTree;
@@ -346,13 +347,10 @@
         abstract void visitDecl(Tree tree, Name name);
 
         @Override
-        public Void visitCompilationUnit(CompilationUnitTree tree, Void ignore) {
-            if (tree.getPackageName() != null) {
-                visitDecl(tree, null);
-            }
-            return super.visitCompilationUnit(tree, ignore);
+        public Void visitPackage(PackageTree tree, Void ignore) {
+            visitDecl(tree, null);
+            return super.visitPackage(tree, ignore);
         }
-
         @Override
         public Void visitClass(ClassTree tree, Void ignore) {
             visitDecl(tree, tree.getSimpleName());
--- a/src/share/classes/com/sun/tools/javac/comp/Attr.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java	Thu Apr 24 16:04:44 2014 -0700
@@ -2616,7 +2616,7 @@
          * - an instance field, we use the first constructor.
          * - a static field, we create a fake clinit method.
          */
-        private Env<AttrContext> lambdaEnv(JCLambda that, Env<AttrContext> env) {
+        public Env<AttrContext> lambdaEnv(JCLambda that, Env<AttrContext> env) {
             Env<AttrContext> lambdaEnv;
             Symbol owner = env.info.scope.owner;
             if (owner.kind == VAR && owner.owner.kind == TYP) {
--- a/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,7 @@
 
 package com.sun.tools.javac.comp;
 
-import com.sun.source.tree.MemberReferenceTree;
+import com.sun.source.tree.LambdaExpressionTree.BodyKind;
 import com.sun.tools.javac.code.*;
 import com.sun.tools.javac.tree.*;
 import com.sun.tools.javac.util.*;
@@ -35,10 +35,8 @@
 import com.sun.tools.javac.comp.Attr.ResultInfo;
 import com.sun.tools.javac.comp.Infer.InferenceContext;
 import com.sun.tools.javac.comp.Resolve.MethodResolutionPhase;
-import com.sun.tools.javac.comp.Resolve.ReferenceLookupHelper;
 import com.sun.tools.javac.tree.JCTree.*;
 
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -48,6 +46,7 @@
 import java.util.Set;
 import java.util.WeakHashMap;
 
+import static com.sun.tools.javac.code.Kinds.VAL;
 import static com.sun.tools.javac.code.TypeTag.*;
 import static com.sun.tools.javac.tree.JCTree.Tag.*;
 
@@ -75,6 +74,8 @@
     final Symtab syms;
     final TreeMaker make;
     final Types types;
+    final Flow flow;
+    final Names names;
 
     public static DeferredAttr instance(Context context) {
         DeferredAttr instance = context.get(deferredAttrKey);
@@ -95,7 +96,8 @@
         syms = Symtab.instance(context);
         make = TreeMaker.instance(context);
         types = Types.instance(context);
-        Names names = Names.instance(context);
+        flow = Flow.instance(context);
+        names = Names.instance(context);
         stuckTree = make.Ident(names.empty).setType(Type.stuckType);
         emptyDeferredAttrContext =
             new DeferredAttrContext(AttrMode.CHECK, null, MethodResolutionPhase.BOX, infer.emptyContext, null, null) {
@@ -138,6 +140,11 @@
             return DEFERRED;
         }
 
+        @Override
+        public String toString() {
+            return "DeferredType";
+        }
+
         /**
          * A speculative cache is used to keep track of all overload resolution rounds
          * that triggered speculative attribution on a given deferred type. Each entry
@@ -376,7 +383,9 @@
         }
     }
     //where
-        protected TreeScanner unenterScanner = new TreeScanner() {
+        protected UnenterScanner unenterScanner = new UnenterScanner();
+
+        class UnenterScanner extends TreeScanner {
             @Override
             public void visitClassDef(JCClassDecl tree) {
                 ClassSymbol csym = tree.sym;
@@ -389,7 +398,7 @@
                 syms.classes.remove(csym.flatname);
                 super.visitClassDef(tree);
             }
-        };
+        }
 
     /**
      * A deferred context is created on each method check. A deferred context is
@@ -593,19 +602,111 @@
             public void visitLambda(JCLambda tree) {
                 Check.CheckContext checkContext = resultInfo.checkContext;
                 Type pt = resultInfo.pt;
-                if (inferenceContext.inferencevars.contains(pt)) {
-                    //ok
-                    return;
-                } else {
+                if (!inferenceContext.inferencevars.contains(pt)) {
                     //must be a functional descriptor
+                    Type descriptorType = null;
                     try {
-                        Type desc = types.findDescriptorType(pt);
-                        if (desc.getParameterTypes().length() != tree.params.length()) {
-                            checkContext.report(tree, diags.fragment("incompatible.arg.types.in.lambda"));
-                        }
+                        descriptorType = types.findDescriptorType(pt);
                     } catch (Types.FunctionDescriptorLookupError ex) {
                         checkContext.report(null, ex.getDiagnostic());
                     }
+
+                    if (descriptorType.getParameterTypes().length() != tree.params.length()) {
+                        checkContext.report(tree,
+                                diags.fragment("incompatible.arg.types.in.lambda"));
+                    }
+
+                    Type currentReturnType = descriptorType.getReturnType();
+                    boolean returnTypeIsVoid = currentReturnType.hasTag(VOID);
+                    if (tree.getBodyKind() == BodyKind.EXPRESSION) {
+                        boolean isExpressionCompatible = !returnTypeIsVoid ||
+                            TreeInfo.isExpressionStatement((JCExpression)tree.getBody());
+                        if (!isExpressionCompatible) {
+                            resultInfo.checkContext.report(tree.pos(),
+                                diags.fragment("incompatible.ret.type.in.lambda",
+                                    diags.fragment("missing.ret.val", currentReturnType)));
+                        }
+                    } else {
+                        LambdaBodyStructChecker lambdaBodyChecker =
+                                new LambdaBodyStructChecker();
+
+                        tree.body.accept(lambdaBodyChecker);
+                        boolean isVoidCompatible = lambdaBodyChecker.isVoidCompatible;
+
+                        if (returnTypeIsVoid) {
+                            if (!isVoidCompatible) {
+                                resultInfo.checkContext.report(tree.pos(),
+                                    diags.fragment("unexpected.ret.val"));
+                            }
+                        } else {
+                            boolean isValueCompatible = lambdaBodyChecker.isPotentiallyValueCompatible
+                                && !canLambdaBodyCompleteNormally(tree);
+                            if (!isValueCompatible && !isVoidCompatible) {
+                                log.error(tree.body.pos(),
+                                    "lambda.body.neither.value.nor.void.compatible");
+                            }
+
+                            if (!isValueCompatible) {
+                                resultInfo.checkContext.report(tree.pos(),
+                                    diags.fragment("incompatible.ret.type.in.lambda",
+                                        diags.fragment("missing.ret.val", currentReturnType)));
+                            }
+                        }
+                    }
+                }
+            }
+
+            boolean canLambdaBodyCompleteNormally(JCLambda tree) {
+                JCLambda newTree = new TreeCopier<>(make).copy(tree);
+                /* attr.lambdaEnv will create a meaningful env for the
+                 * lambda expression. This is specially useful when the
+                 * lambda is used as the init of a field. But we need to
+                 * remove any added symbol.
+                 */
+                Env<AttrContext> localEnv = attr.lambdaEnv(newTree, env);
+                try {
+                    List<JCVariableDecl> tmpParams = newTree.params;
+                    while (tmpParams.nonEmpty()) {
+                        tmpParams.head.vartype = make.at(tmpParams.head).Type(syms.errType);
+                        tmpParams = tmpParams.tail;
+                    }
+
+                    attr.attribStats(newTree.params, localEnv);
+
+                    /* set pt to Type.noType to avoid generating any bound
+                     * which may happen if lambda's return type is an
+                     * inference variable
+                     */
+                    Attr.ResultInfo bodyResultInfo = attr.new ResultInfo(VAL, Type.noType);
+                    localEnv.info.returnResult = bodyResultInfo;
+
+                    // discard any log output
+                    Log.DiagnosticHandler diagHandler = new Log.DiscardDiagnosticHandler(log);
+                    try {
+                        JCBlock body = (JCBlock)newTree.body;
+                        /* we need to attribute the lambda body before
+                         * doing the aliveness analysis. This is because
+                         * constant folding occurs during attribution
+                         * and the reachability of some statements depends
+                         * on constant values, for example:
+                         *
+                         *     while (true) {...}
+                         */
+                        attr.attribStats(body.stats, localEnv);
+
+                        attr.preFlow(newTree);
+                        /* make an aliveness / reachability analysis of the lambda
+                         * to determine if it can complete normally
+                         */
+                        flow.analyzeLambda(localEnv, newTree, make, true);
+                    } finally {
+                        log.popDiagnosticHandler(diagHandler);
+                    }
+                    return newTree.canCompleteNormally;
+                } finally {
+                    JCBlock body = (JCBlock)newTree.body;
+                    unenterScanner.scan(body.stats);
+                    localEnv.info.scope.leave();
                 }
             }
 
@@ -623,10 +724,7 @@
             public void visitReference(JCMemberReference tree) {
                 Check.CheckContext checkContext = resultInfo.checkContext;
                 Type pt = resultInfo.pt;
-                if (inferenceContext.inferencevars.contains(pt)) {
-                    //ok
-                    return;
-                } else {
+                if (!inferenceContext.inferencevars.contains(pt)) {
                     try {
                         types.findDescriptorType(pt);
                     } catch (Types.FunctionDescriptorLookupError ex) {
@@ -656,6 +754,40 @@
                 }
             }
         }
+
+        /* This visitor looks for return statements, its analysis will determine if
+         * a lambda body is void or value compatible. We must analyze return
+         * statements contained in the lambda body only, thus any return statement
+         * contained in an inner class or inner lambda body, should be ignored.
+         */
+        class LambdaBodyStructChecker extends TreeScanner {
+            boolean isVoidCompatible = true;
+            boolean isPotentiallyValueCompatible = true;
+
+            @Override
+            public void visitClassDef(JCClassDecl tree) {
+                // do nothing
+            }
+
+            @Override
+            public void visitLambda(JCLambda tree) {
+                // do nothing
+            }
+
+            @Override
+            public void visitNewClass(JCNewClass tree) {
+                // do nothing
+            }
+
+            @Override
+            public void visitReturn(JCReturn tree) {
+                if (tree.expr != null) {
+                    isVoidCompatible = false;
+                } else {
+                    isPotentiallyValueCompatible = false;
+                }
+            }
+        }
     }
 
     /** an empty deferred attribution context - all methods throw exceptions */
@@ -767,7 +899,7 @@
         /**
          * handler that is executed when a node has been discarded
          */
-        abstract void skip(JCTree tree);
+        void skip(JCTree tree) {}
     }
 
     /**
@@ -779,11 +911,6 @@
         PolyScanner() {
             super(EnumSet.of(CONDEXPR, PARENS, LAMBDA, REFERENCE));
         }
-
-        @Override
-        void skip(JCTree tree) {
-            //do nothing
-        }
     }
 
     /**
@@ -796,11 +923,6 @@
             super(EnumSet.of(BLOCK, CASE, CATCH, DOLOOP, FOREACHLOOP,
                     FORLOOP, RETURN, SYNCHRONIZED, SWITCH, TRY, WHILELOOP));
         }
-
-        @Override
-        void skip(JCTree tree) {
-            //do nothing
-        }
     }
 
     /**
--- a/src/share/classes/com/sun/tools/javac/comp/Enter.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/Enter.java	Thu Apr 24 16:04:44 2014 -0700
@@ -288,15 +288,16 @@
         boolean addEnv = false;
         boolean isPkgInfo = tree.sourcefile.isNameCompatible("package-info",
                                                              JavaFileObject.Kind.SOURCE);
-        if (tree.pid != null) {
-            tree.packge = syms.enterPackage(TreeInfo.fullName(tree.pid));
-            if (tree.packageAnnotations.nonEmpty()
-                    || pkginfoOpt == PkgInfo.ALWAYS
-                    || tree.docComments != null) {
+        JCPackageDecl pd = tree.getPackage();
+        if (pd != null) {
+            tree.packge = pd.packge = syms.enterPackage(TreeInfo.fullName(pd.pid));
+            if (   pd.annotations.nonEmpty()
+                || pkginfoOpt == PkgInfo.ALWAYS
+                || tree.docComments != null) {
                 if (isPkgInfo) {
                     addEnv = true;
-                } else if (tree.packageAnnotations.nonEmpty()){
-                    log.error(tree.packageAnnotations.head.pos(),
+                } else if (pd.annotations.nonEmpty()) {
+                    log.error(pd.annotations.head.pos(),
                               "pkg.annotations.sb.in.package-info.java");
                 }
             }
@@ -305,26 +306,20 @@
         }
         tree.packge.complete(); // Find all classes in package.
         Env<AttrContext> topEnv = topLevelEnv(tree);
+        Env<AttrContext> packageEnv = isPkgInfo ? topEnv.dup(pd) : null;
 
         // Save environment of package-info.java file.
         if (isPkgInfo) {
             Env<AttrContext> env0 = typeEnvs.get(tree.packge);
-            if (env0 == null) {
-                typeEnvs.put(tree.packge, topEnv);
-            } else {
+            if (env0 != null) {
                 JCCompilationUnit tree0 = env0.toplevel;
                 if (!fileManager.isSameFile(tree.sourcefile, tree0.sourcefile)) {
-                    log.warning(tree.pid != null ? tree.pid.pos()
-                                                 : null,
+                    log.warning(pd != null ? pd.pid.pos() : null,
                                 "pkg-info.already.seen",
                                 tree.packge);
-                    if (addEnv || (tree0.packageAnnotations.isEmpty() &&
-                                   tree.docComments != null &&
-                                   tree.docComments.hasComment(tree))) {
-                        typeEnvs.put(tree.packge, topEnv);
-                    }
                 }
             }
+            typeEnvs.put(tree.packge, packageEnv);
 
             for (Symbol q = tree.packge; q != null && q.kind == PCK; q = q.owner)
                 q.flags_field |= EXISTS;
@@ -339,7 +334,7 @@
         }
         classEnter(tree.defs, topEnv);
         if (addEnv) {
-            todo.append(topEnv);
+            todo.append(packageEnv);
         }
         log.useSource(prev);
         result = null;
--- a/src/share/classes/com/sun/tools/javac/comp/Flow.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/Flow.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -45,7 +45,7 @@
 import static com.sun.tools.javac.tree.JCTree.Tag.*;
 
 /** This pass implements dataflow analysis for Java programs though
- *  different AST visitor steps. Liveness analysis (see AliveAlanyzer) checks that
+ *  different AST visitor steps. Liveness analysis (see AliveAnalyzer) checks that
  *  every statement is reachable. Exception analysis (see FlowAnalyzer) ensures that
  *  every checked exception that is thrown is declared or caught.  Definite assignment analysis
  *  (see AssignAnalyzer) ensures that each variable is assigned when used.  Definite
@@ -388,6 +388,10 @@
                 super.scan(tree);
             }
         }
+
+        public void visitPackageDef(JCPackageDecl tree) {
+            // Do nothing for PackageDecl
+        }
     }
 
     /**
@@ -723,10 +727,6 @@
             }
         }
 
-        public void visitTopLevel(JCCompilationUnit tree) {
-            // Do nothing for TopLevel since each class is visited individually
-        }
-
     /**************************************************************************
      * main method
      *************************************************************************/
@@ -1289,10 +1289,6 @@
             }
         }
 
-        public void visitTopLevel(JCCompilationUnit tree) {
-            // Do nothing for TopLevel since each class is visited individually
-        }
-
     /**************************************************************************
      * main method
      *************************************************************************/
@@ -2357,10 +2353,6 @@
             tree.underlyingType.accept(this);
         }
 
-        public void visitTopLevel(JCCompilationUnit tree) {
-            // Do nothing for TopLevel since each class is visited individually
-        }
-
     /**************************************************************************
      * main method
      *************************************************************************/
@@ -2677,10 +2669,6 @@
             }
         }
 
-        public void visitTopLevel(JCCompilationUnit tree) {
-            // Do nothing for TopLevel since each class is visited individually
-        }
-
     /**************************************************************************
      * main method
      *************************************************************************/
--- a/src/share/classes/com/sun/tools/javac/comp/Infer.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/Infer.java	Thu Apr 24 16:04:44 2014 -0700
@@ -515,6 +515,32 @@
     /** max number of incorporation rounds */
         static final int MAX_INCORPORATION_STEPS = 100;
 
+    /* If for two types t and s there is a least upper bound that is a
+     * parameterized type G, then there exists a supertype of 't' of the form
+     * G<T1, ..., Tn> and a supertype of 's' of the form G<S1, ..., Sn>
+     * which will be returned by this method. If no such supertypes exists then
+     * null is returned.
+     *
+     * As an example for the following input:
+     *
+     * t = java.util.ArrayList<java.lang.String>
+     * s = java.util.List<T>
+     *
+     * we get this ouput:
+     *
+     * Pair[java.util.List<java.lang.String>,java.util.List<T>]
+     */
+    private Pair<Type, Type> getParameterizedSupers(Type t, Type s) {
+        Type lubResult = types.lub(t, s);
+        if (lubResult == syms.errType || lubResult == syms.botType ||
+                !lubResult.isParameterized()) {
+            return null;
+        }
+        Type asSuperOfT = types.asSuper(t, lubResult.tsym);
+        Type asSuperOfS = types.asSuper(s, lubResult.tsym);
+        return new Pair<>(asSuperOfT, asSuperOfS);
+    }
+
     /**
      * This enumeration defines an entry point for doing inference variable
      * bound incorporation - it can be used to inject custom incorporation
@@ -682,6 +708,53 @@
             }
         },
         /**
+         * Given a bound set containing {@code alpha <: P<T>} and
+         * {@code alpha <: P<S>} where P is a parameterized type,
+         * perform {@code T = S} (which could lead to new bounds).
+         */
+        CROSS_UPPER_UPPER() {
+            @Override
+            public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) {
+                Infer infer = inferenceContext.infer();
+                List<Type> boundList = uv.getBounds(InferenceBound.UPPER);
+                List<Type> boundListTail = boundList.tail;
+                while (boundList.nonEmpty()) {
+                    List<Type> tmpTail = boundListTail;
+                    while (tmpTail.nonEmpty()) {
+                        Type b1 = boundList.head;
+                        Type b2 = tmpTail.head;
+                        if (b1 != b2) {
+                            Pair<Type, Type> commonSupers = infer.getParameterizedSupers(b1, b2);
+                            if (commonSupers != null) {
+                                List<Type> allParamsSuperBound1 = commonSupers.fst.allparams();
+                                List<Type> allParamsSuperBound2 = commonSupers.snd.allparams();
+                                while (allParamsSuperBound1.nonEmpty() && allParamsSuperBound2.nonEmpty()) {
+                                    //traverse the list of all params comparing them
+                                    if (!allParamsSuperBound1.head.hasTag(WILDCARD) &&
+                                        !allParamsSuperBound2.head.hasTag(WILDCARD)) {
+                                        isSameType(inferenceContext.asUndetVar(allParamsSuperBound1.head),
+                                            inferenceContext.asUndetVar(allParamsSuperBound2.head), infer);
+                                    }
+                                    allParamsSuperBound1 = allParamsSuperBound1.tail;
+                                    allParamsSuperBound2 = allParamsSuperBound2.tail;
+                                }
+                                Assert.check(allParamsSuperBound1.isEmpty() && allParamsSuperBound2.isEmpty());
+                            }
+                        }
+                        tmpTail = tmpTail.tail;
+                    }
+                    boundList = boundList.tail;
+                    boundListTail = boundList.tail;
+                }
+            }
+
+            @Override
+            boolean accepts(UndetVar uv, InferenceContext inferenceContext) {
+                return !uv.isCaptured() &&
+                        uv.getBounds(InferenceBound.UPPER).nonEmpty();
+            }
+        },
+        /**
          * Given a bound set containing {@code alpha == S} and {@code alpha == T}
          * perform {@code S == T} (which could lead to new bounds).
          */
--- a/src/share/classes/com/sun/tools/javac/comp/Lower.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/Lower.java	Thu Apr 24 16:04:44 2014 -0700
@@ -2359,6 +2359,7 @@
     /** Visitor method: Translate a single node.
      *  Attach the source position from the old tree to its replacement tree.
      */
+    @Override
     public <T extends JCTree> T translate(T tree) {
         if (tree == null) {
             return null;
@@ -2407,39 +2408,39 @@
         return trees;
     }
 
-    public void visitTopLevel(JCCompilationUnit tree) {
-        if (needPackageInfoClass(tree)) {
-            Name name = names.package_info;
-            long flags = Flags.ABSTRACT | Flags.INTERFACE;
-            if (target.isPackageInfoSynthetic())
-                // package-info is marked SYNTHETIC in JDK 1.6 and later releases
-                flags = flags | Flags.SYNTHETIC;
-            JCClassDecl packageAnnotationsClass
-                = make.ClassDef(make.Modifiers(flags,
-                                               tree.packageAnnotations),
-                                name, List.<JCTypeParameter>nil(),
-                                null, List.<JCExpression>nil(), List.<JCTree>nil());
-            ClassSymbol c = tree.packge.package_info;
-            c.flags_field |= flags;
-            c.setAttributes(tree.packge);
-            ClassType ctype = (ClassType) c.type;
-            ctype.supertype_field = syms.objectType;
-            ctype.interfaces_field = List.nil();
-            packageAnnotationsClass.sym = c;
-
-            translated.append(packageAnnotationsClass);
-        }
+    public void visitPackageDef(JCPackageDecl tree) {
+        if (!needPackageInfoClass(tree))
+            return;
+
+        Name name = names.package_info;
+        long flags = Flags.ABSTRACT | Flags.INTERFACE;
+        if (target.isPackageInfoSynthetic())
+            // package-info is marked SYNTHETIC in JDK 1.6 and later releases
+            flags = flags | Flags.SYNTHETIC;
+        JCClassDecl packageAnnotationsClass
+            = make.ClassDef(make.Modifiers(flags, tree.getAnnotations()),
+                            name, List.<JCTypeParameter>nil(),
+                            null, List.<JCExpression>nil(), List.<JCTree>nil());
+        ClassSymbol c = tree.packge.package_info;
+        c.flags_field |= flags;
+        c.setAttributes(tree.packge);
+        ClassType ctype = (ClassType) c.type;
+        ctype.supertype_field = syms.objectType;
+        ctype.interfaces_field = List.nil();
+        packageAnnotationsClass.sym = c;
+
+        translated.append(packageAnnotationsClass);
     }
     // where
-    private boolean needPackageInfoClass(JCCompilationUnit tree) {
+    private boolean needPackageInfoClass(JCPackageDecl pd) {
         switch (pkginfoOpt) {
             case ALWAYS:
                 return true;
             case LEGACY:
-                return tree.packageAnnotations.nonEmpty();
+                return pd.getAnnotations().nonEmpty();
             case NONEMPTY:
                 for (Attribute.Compound a :
-                         tree.packge.getDeclarationAttributes()) {
+                         pd.packge.getDeclarationAttributes()) {
                     Attribute.RetentionPolicy p = types.getRetention(a);
                     if (p != Attribute.RetentionPolicy.SOURCE)
                         return true;
--- a/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java	Thu Apr 24 16:04:44 2014 -0700
@@ -493,10 +493,26 @@
             return;
         }
 
+        DiagnosticPosition prevLintPos = deferredLintHandler.immediate();
+        Lint prevLint = chk.setLint(lint);
+
+        try {
+            // Import-on-demand java.lang.
+            importAll(tree.pos, syms.enterPackage(names.java_lang), env);
+
+            // Process the package def and all import clauses.
+            memberEnter(tree.defs, env);
+        } finally {
+            chk.setLint(prevLint);
+            deferredLintHandler.setPos(prevLintPos);
+        }
+    }
+
+    public void visitPackageDef(JCPackageDecl tree) {
         // check that no class exists with same fully qualified name as
         // toplevel package
         if (checkClash && tree.pid != null) {
-            Symbol p = tree.packge;
+            Symbol p = env.toplevel.packge;
             while (p.owner != syms.rootPackage) {
                 p.owner.complete(); // enter all class members of p
                 if (syms.classes.get(p.getQualifiedName()) != null) {
@@ -507,23 +523,8 @@
                 p = p.owner;
             }
         }
-
         // process package annotations
-        annotate.annotateLater(tree.packageAnnotations, env, tree.packge, null);
-
-        DiagnosticPosition prevLintPos = deferredLintHandler.immediate();
-        Lint prevLint = chk.setLint(lint);
-
-        try {
-            // Import-on-demand java.lang.
-            importAll(tree.pos, syms.enterPackage(names.java_lang), env);
-
-            // Process all import clauses.
-            memberEnter(tree.defs, env);
-        } finally {
-            chk.setLint(prevLint);
-            deferredLintHandler.setPos(prevLintPos);
-        }
+        annotate.annotateLater(tree.annotations, env, env.toplevel.packge, null);
     }
 
     // process the non-static imports and the static imports of types.
--- a/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Thu Apr 24 16:04:44 2014 -0700
@@ -475,14 +475,14 @@
             break;
         case CONSTANT_Fieldref: {
             ClassSymbol owner = readClassSymbol(getChar(index + 1));
-            NameAndType nt = (NameAndType)readPool(getChar(index + 3));
+            NameAndType nt = readNameAndType(getChar(index + 3));
             poolObj[i] = new VarSymbol(0, nt.name, nt.uniqueType.type, owner);
             break;
         }
         case CONSTANT_Methodref:
         case CONSTANT_InterfaceMethodref: {
             ClassSymbol owner = readClassSymbol(getChar(index + 1));
-            NameAndType nt = (NameAndType)readPool(getChar(index + 3));
+            NameAndType nt = readNameAndType(getChar(index + 3));
             poolObj[i] = new MethodSymbol(0, nt.name, nt.uniqueType.type, owner);
             break;
         }
@@ -551,13 +551,34 @@
     /** Read class entry.
      */
     ClassSymbol readClassSymbol(int i) {
-        return (ClassSymbol) (readPool(i));
+        Object obj = readPool(i);
+        if (obj != null && !(obj instanceof ClassSymbol))
+            throw badClassFile("bad.const.pool.entry",
+                               currentClassFile.toString(),
+                               "CONSTANT_Class_info", i);
+        return (ClassSymbol)obj;
     }
 
     /** Read name.
      */
     Name readName(int i) {
-        return (Name) (readPool(i));
+        Object obj = readPool(i);
+        if (obj != null && !(obj instanceof Name))
+            throw badClassFile("bad.const.pool.entry",
+                               currentClassFile.toString(),
+                               "CONSTANT_Utf8_info or CONSTANT_String_info", i);
+        return (Name)obj;
+    }
+
+    /** Read name and type.
+     */
+    NameAndType readNameAndType(int i) {
+        Object obj = readPool(i);
+        if (obj != null && !(obj instanceof NameAndType))
+            throw badClassFile("bad.const.pool.entry",
+                               currentClassFile.toString(),
+                               "CONSTANT_NameAndType_info", i);
+        return (NameAndType)obj;
     }
 
 /************************************************************************
@@ -1209,7 +1230,7 @@
         sym.owner.members().remove(sym);
         ClassSymbol self = (ClassSymbol)sym;
         ClassSymbol c = readClassSymbol(nextChar());
-        NameAndType nt = (NameAndType)readPool(nextChar());
+        NameAndType nt = readNameAndType(nextChar());
 
         if (c.members_field == null)
             throw badClassFile("bad.enclosing.class", self, c);
--- a/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Thu Apr 24 16:04:44 2014 -0700
@@ -601,8 +601,7 @@
      */
     protected JCCompilationUnit parse(JavaFileObject filename, CharSequence content) {
         long msec = now();
-        JCCompilationUnit tree = make.TopLevel(List.<JCTree.JCAnnotation>nil(),
-                                      null, List.<JCTree>nil());
+        JCCompilationUnit tree = make.TopLevel(List.<JCTree>nil());
         if (content != null) {
             if (verbose) {
                 log.printVerbose("parsing.started", filename);
@@ -689,7 +688,7 @@
                                       : make.Select(tree, names.fromString(s));
             }
             JCCompilationUnit toplevel =
-                make.TopLevel(List.<JCTree.JCAnnotation>nil(), null, List.<JCTree>nil());
+                make.TopLevel(List.<JCTree>nil());
             toplevel.packge = syms.unnamedPackage;
             return attr.attribIdent(tree, toplevel);
         } finally {
@@ -768,7 +767,7 @@
                 tree = parse(filename, filename.getCharContent(false));
             } catch (IOException e) {
                 log.error("error.reading.file", filename, JavacFileManager.getMessage(e));
-                tree = make.TopLevel(List.<JCTree.JCAnnotation>nil(), null, List.<JCTree>nil());
+                tree = make.TopLevel(List.<JCTree>nil());
             } finally {
                 log.useSource(prev);
             }
@@ -1440,7 +1439,7 @@
             make.at(Position.FIRSTPOS);
             TreeMaker localMake = make.forToplevel(env.toplevel);
 
-            if (env.tree instanceof JCCompilationUnit) {
+            if (env.tree.hasTag(JCTree.Tag.PACKAGEDEF)) {
                 if (!(stubOutput || sourceOutput || printFlat)) {
                     if (shouldStop(CompileState.LOWER))
                         return;
--- a/src/share/classes/com/sun/tools/javac/model/JavacElements.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/model/JavacElements.java	Thu Apr 24 16:04:44 2014 -0700
@@ -170,8 +170,8 @@
         Symbol sym = cast(Symbol.class, e);
         class Vis extends JCTree.Visitor {
             List<JCAnnotation> result = null;
-            public void visitTopLevel(JCCompilationUnit tree) {
-                result = tree.packageAnnotations;
+            public void visitPackageDef(JCPackageDecl tree) {
+                result = tree.annotations;
             }
             public void visitClassDef(JCClassDecl tree) {
                 result = tree.mods.annotations;
--- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Thu Apr 24 16:04:44 2014 -0700
@@ -3081,27 +3081,33 @@
      */
     public JCTree.JCCompilationUnit parseCompilationUnit() {
         Token firstToken = token;
-        JCExpression pid = null;
         JCModifiers mods = null;
         boolean consumedToplevelDoc = false;
         boolean seenImport = false;
         boolean seenPackage = false;
-        List<JCAnnotation> packageAnnotations = List.nil();
+        ListBuffer<JCTree> defs = new ListBuffer<>();
         if (token.kind == MONKEYS_AT)
             mods = modifiersOpt();
 
         if (token.kind == PACKAGE) {
+            int packagePos = token.pos;
+            List<JCAnnotation> annotations = List.nil();
             seenPackage = true;
             if (mods != null) {
                 checkNoMods(mods.flags);
-                packageAnnotations = mods.annotations;
+                annotations = mods.annotations;
                 mods = null;
             }
             nextToken();
-            pid = qualident(false);
+            JCExpression pid = qualident(false);
             accept(SEMI);
+            JCPackageDecl pd = F.at(packagePos).PackageDecl(annotations, pid);
+            attach(pd, firstToken.comment(CommentStyle.JAVADOC));
+            consumedToplevelDoc = true;
+            storeEnd(pd, token.pos);
+            defs.append(pd);
         }
-        ListBuffer<JCTree> defs = new ListBuffer<>();
+
         boolean checkForImports = true;
         boolean firstTypeDecl = true;
         while (token.kind != EOF) {
@@ -3130,7 +3136,7 @@
                 firstTypeDecl = false;
             }
         }
-        JCTree.JCCompilationUnit toplevel = F.at(firstToken.pos).TopLevel(packageAnnotations, pid, defs.toList());
+        JCTree.JCCompilationUnit toplevel = F.at(firstToken.pos).TopLevel(defs.toList());
         if (!consumedToplevelDoc)
             attach(toplevel, firstToken.comment(CommentStyle.JAVADOC));
         if (defs.isEmpty())
@@ -3417,16 +3423,28 @@
      *    | ModifiersOpt
      *      ( Type Ident
      *        ( VariableDeclaratorsRest ";" | MethodDeclaratorRest )
-     *      | VOID Ident MethodDeclaratorRest
-     *      | TypeParameters (Type | VOID) Ident MethodDeclaratorRest
+     *      | VOID Ident VoidMethodDeclaratorRest
+     *      | TypeParameters [Annotations]
+     *        ( Type Ident MethodDeclaratorRest
+     *        | VOID Ident VoidMethodDeclaratorRest
+     *        )
      *      | Ident ConstructorDeclaratorRest
      *      | TypeParameters Ident ConstructorDeclaratorRest
      *      | ClassOrInterfaceOrEnumDeclaration
      *      )
      *  InterfaceBodyDeclaration =
      *      ";"
-     *    | ModifiersOpt Type Ident
-     *      ( ConstantDeclaratorsRest | InterfaceMethodDeclaratorRest ";" )
+     *    | ModifiersOpt
+     *      ( Type Ident
+     *        ( ConstantDeclaratorsRest ";" | MethodDeclaratorRest )
+     *      | VOID Ident MethodDeclaratorRest
+     *      | TypeParameters [Annotations]
+     *        ( Type Ident MethodDeclaratorRest
+     *        | VOID Ident VoidMethodDeclaratorRest
+     *        )
+     *      | ClassOrInterfaceOrEnumDeclaration
+     *      )
+     *
      */
     protected List<JCTree> classOrInterfaceBodyDeclaration(Name className, boolean isInterface) {
         if (token.kind == SEMI) {
@@ -3458,28 +3476,29 @@
                 }
                 List<JCAnnotation> annosAfterParams = annotationsOpt(Tag.ANNOTATION);
 
+                if (annosAfterParams.nonEmpty()) {
+                    checkAnnotationsAfterTypeParams(annosAfterParams.head.pos);
+                    mods.annotations = mods.annotations.appendList(annosAfterParams);
+                    if (mods.pos == Position.NOPOS)
+                        mods.pos = mods.annotations.head.pos;
+                }
+
                 Token tk = token;
                 pos = token.pos;
                 JCExpression type;
                 boolean isVoid = token.kind == VOID;
                 if (isVoid) {
-                    if (annosAfterParams.nonEmpty())
-                        illegal(annosAfterParams.head.pos);
                     type = to(F.at(pos).TypeIdent(TypeTag.VOID));
                     nextToken();
                 } else {
-                    if (annosAfterParams.nonEmpty()) {
-                        checkAnnotationsAfterTypeParams(annosAfterParams.head.pos);
-                        mods.annotations = mods.annotations.appendList(annosAfterParams);
-                        if (mods.pos == Position.NOPOS)
-                            mods.pos = mods.annotations.head.pos;
-                    }
                     // method returns types are un-annotated types
                     type = unannotatedType();
                 }
                 if (token.kind == LPAREN && !isInterface && type.hasTag(IDENT)) {
                     if (isInterface || tk.name() != className)
                         error(pos, "invalid.meth.decl.ret.type.req");
+                    else if (annosAfterParams.nonEmpty())
+                        illegal(annosAfterParams.head.pos);
                     return List.of(methodDeclaratorRest(
                         pos, mods, null, names.init, typarams,
                         isInterface, true, dc));
@@ -3511,13 +3530,9 @@
     }
 
     /** MethodDeclaratorRest =
-     *      FormalParameters BracketsOpt [Throws TypeList] ( MethodBody | [DEFAULT AnnotationValue] ";")
+     *      FormalParameters BracketsOpt [THROWS TypeList] ( MethodBody | [DEFAULT AnnotationValue] ";")
      *  VoidMethodDeclaratorRest =
-     *      FormalParameters [Throws TypeList] ( MethodBody | ";")
-     *  InterfaceMethodDeclaratorRest =
-     *      FormalParameters BracketsOpt [THROWS TypeList] ";"
-     *  VoidInterfaceMethodDeclaratorRest =
-     *      FormalParameters [THROWS TypeList] ";"
+     *      FormalParameters [THROWS TypeList] ( MethodBody | ";")
      *  ConstructorDeclaratorRest =
      *      "(" FormalParameterListOpt ")" [THROWS TypeList] MethodBody
      */
--- a/src/share/classes/com/sun/tools/javac/resources/compiler.properties	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/resources/compiler.properties	Thu Apr 24 16:04:44 2014 -0700
@@ -738,6 +738,9 @@
     bad return type in method reference\n\
     {0}
 
+compiler.err.lambda.body.neither.value.nor.void.compatible=\
+    lambda body is neither value nor void compatible
+
 # 0: list of type
 compiler.err.incompatible.thrown.types.in.mref=\
     incompatible thrown types {0} in method reference
@@ -1716,6 +1719,11 @@
 compiler.misc.bad.class.file=\
     class file is invalid for class {0}
 
+# 0: file name, 1: expected CP entry type, 2: constant pool index
+compiler.misc.bad.const.pool.entry=\
+    bad constant pool entry in {0}\n\
+    expected {1} at index {2}
+
 # 0: file name, 1: message segment
 compiler.misc.bad.class.file.header=\
     bad class file: {0}\n\
--- a/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Thu Apr 24 16:04:44 2014 -0700
@@ -89,6 +89,10 @@
         */
         TOPLEVEL,
 
+        /** Package level definitions.
+         */
+        PACKAGEDEF,
+
         /** Import clauses, of type Import.
          */
         IMPORT,
@@ -478,9 +482,6 @@
      * Everything in one source file is kept in a {@linkplain JCCompilationUnit} structure.
      */
     public static class JCCompilationUnit extends JCTree implements CompilationUnitTree {
-        public List<JCAnnotation> packageAnnotations;
-        /** The tree representing the package clause. */
-        public JCExpression pid;
         /** All definitions in this file (ClassDef, Import, and Skip) */
         public List<JCTree> defs;
         /* The source file name. */
@@ -499,39 +500,39 @@
         /* An object encapsulating ending positions of source ranges indexed by
          * the tree nodes they belong to. Defined only if option -Xjcov is set. */
         public EndPosTable endPositions = null;
-        protected JCCompilationUnit(List<JCAnnotation> packageAnnotations,
-                        JCExpression pid,
-                        List<JCTree> defs,
-                        JavaFileObject sourcefile,
-                        PackageSymbol packge,
-                        ImportScope namedImportScope,
-                        StarImportScope starImportScope) {
-            this.packageAnnotations = packageAnnotations;
-            this.pid = pid;
+        protected JCCompilationUnit(List<JCTree> defs) {
             this.defs = defs;
-            this.sourcefile = sourcefile;
-            this.packge = packge;
-            this.namedImportScope = namedImportScope;
-            this.starImportScope = starImportScope;
         }
         @Override
         public void accept(Visitor v) { v.visitTopLevel(this); }
 
         public Kind getKind() { return Kind.COMPILATION_UNIT; }
+
+        public JCPackageDecl getPackage() {
+            // PackageDecl must be the first entry if it exists
+            if (!defs.isEmpty() && defs.head.hasTag(PACKAGEDEF))
+                return (JCPackageDecl)defs.head;
+            return null;
+        }
         public List<JCAnnotation> getPackageAnnotations() {
-            return packageAnnotations;
+            JCPackageDecl pd = getPackage();
+            return pd != null ? pd.getAnnotations() : List.<JCAnnotation>nil();
         }
+        public ExpressionTree getPackageName() {
+            JCPackageDecl pd = getPackage();
+            return pd != null ? pd.getPackageName() : null;
+        }
+
         public List<JCImport> getImports() {
             ListBuffer<JCImport> imports = new ListBuffer<>();
             for (JCTree tree : defs) {
                 if (tree.hasTag(IMPORT))
                     imports.append((JCImport)tree);
-                else if (!tree.hasTag(SKIP))
+                else if (!tree.hasTag(PACKAGEDEF) && !tree.hasTag(SKIP))
                     break;
             }
             return imports.toList();
         }
-        public JCExpression getPackageName() { return pid; }
         public JavaFileObject getSourceFile() {
             return sourcefile;
         }
@@ -541,7 +542,7 @@
         public List<JCTree> getTypeDecls() {
             List<JCTree> typeDefs;
             for (typeDefs = defs; !typeDefs.isEmpty(); typeDefs = typeDefs.tail)
-                if (!typeDefs.head.hasTag(IMPORT))
+                if (!typeDefs.head.hasTag(PACKAGEDEF) && !typeDefs.head.hasTag(IMPORT))
                     break;
             return typeDefs;
         }
@@ -557,6 +558,39 @@
     }
 
     /**
+     * Package definition.
+     */
+    public static class JCPackageDecl extends JCTree implements PackageTree {
+        public List<JCAnnotation> annotations;
+        /** The tree representing the package clause. */
+        public JCExpression pid;
+        public PackageSymbol packge;
+        public JCPackageDecl(List<JCAnnotation> annotations, JCExpression pid) {
+            this.annotations = annotations;
+            this.pid = pid;
+        }
+        @Override
+        public void accept(Visitor v) { v.visitPackageDef(this); }
+        public Kind getKind() {
+            return Kind.PACKAGE;
+        }
+        public List<JCAnnotation> getAnnotations() {
+            return annotations;
+        }
+        public JCExpression getPackageName() {
+            return pid;
+        }
+        @Override
+        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
+            return v.visitPackage(this, d);
+        }
+        @Override
+        public Tag getTag() {
+            return PACKAGEDEF;
+        }
+    }
+
+    /**
      * An import clause.
      */
     public static class JCImport extends JCTree implements ImportTree {
@@ -2438,9 +2472,9 @@
     /** An interface for tree factories
      */
     public interface Factory {
-        JCCompilationUnit TopLevel(List<JCAnnotation> packageAnnotations,
-                                   JCExpression pid,
-                                   List<JCTree> defs);
+        JCCompilationUnit TopLevel(List<JCTree> defs);
+        JCPackageDecl PackageDecl(List<JCAnnotation> annotations,
+                                  JCExpression pid);
         JCImport Import(JCTree qualid, boolean staticImport);
         JCClassDecl ClassDef(JCModifiers mods,
                           Name name,
@@ -2528,6 +2562,7 @@
      */
     public static abstract class Visitor {
         public void visitTopLevel(JCCompilationUnit that)    { visitTree(that); }
+        public void visitPackageDef(JCPackageDecl that)      { visitTree(that); }
         public void visitImport(JCImport that)               { visitTree(that); }
         public void visitClassDef(JCClassDecl that)          { visitTree(that); }
         public void visitMethodDef(JCMethodDecl that)        { visitTree(that); }
--- a/src/share/classes/com/sun/tools/javac/tree/Pretty.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/tree/Pretty.java	Thu Apr 24 16:04:44 2014 -0700
@@ -367,16 +367,13 @@
     public void printUnit(JCCompilationUnit tree, JCClassDecl cdef) throws IOException {
         docComments = tree.docComments;
         printDocComment(tree);
-        if (tree.pid != null) {
-            print("package ");
-            printExpr(tree.pid);
-            print(";");
-            println();
-        }
+
         boolean firstImport = true;
         for (List<JCTree> l = tree.defs;
-        l.nonEmpty() && (cdef == null || l.head.hasTag(IMPORT));
-        l = l.tail) {
+             l.nonEmpty() &&
+                 (cdef == null ||
+                  l.head.hasTag(IMPORT) || l.head.hasTag(PACKAGEDEF));
+             l = l.tail) {
             if (l.head.hasTag(IMPORT)) {
                 JCImport imp = (JCImport)l.head;
                 Name name = TreeInfo.name(imp.qualid);
@@ -426,6 +423,21 @@
         }
     }
 
+    public void visitPackageDef(JCPackageDecl tree) {
+        try {
+            printDocComment(tree);
+            printAnnotations(tree.annotations);
+            if (tree.pid != null) {
+                print("package ");
+                printExpr(tree.pid);
+                print(";");
+                println();
+            }
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
     public void visitImport(JCImport tree) {
         try {
             print("import ");
--- a/src/share/classes/com/sun/tools/javac/tree/TreeCopier.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/tree/TreeCopier.java	Thu Apr 24 16:04:44 2014 -0700
@@ -346,10 +346,15 @@
 
     public JCTree visitCompilationUnit(CompilationUnitTree node, P p) {
         JCCompilationUnit t = (JCCompilationUnit) node;
-        List<JCAnnotation> packageAnnotations = copy(t.packageAnnotations, p);
+        List<JCTree> defs = copy(t.defs, p);
+        return M.at(t.pos).TopLevel(defs);
+    }
+
+    public JCTree visitPackage(PackageTree node, P p) {
+        JCPackageDecl t = (JCPackageDecl) node;
+        List<JCAnnotation> annotations = copy(t.annotations, p);
         JCExpression pid = copy(t.pid, p);
-        List<JCTree> defs = copy(t.defs, p);
-        return M.at(t.pos).TopLevel(packageAnnotations, pid, defs);
+        return M.at(t.pos).PackageDecl(annotations, pid);
     }
 
     public JCTree visitTry(TryTree node, P p) {
--- a/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java	Thu Apr 24 16:04:44 2014 -0700
@@ -406,6 +406,11 @@
             return Position.NOPOS;
 
         switch(tree.getTag()) {
+            case PACKAGEDEF: {
+                JCPackageDecl pd = (JCPackageDecl)tree;
+                return pd.annotations.isEmpty() ? pd.pos :
+                       pd.annotations.head.pos;
+            }
             case APPLY:
                 return getStartPos(((JCMethodInvocation) tree).meth);
             case ASSIGN:
@@ -788,6 +793,8 @@
         switch (node.getTag()) {
         case TOPLEVEL:
             return ((JCCompilationUnit) node).packge;
+        case PACKAGEDEF:
+            return ((JCPackageDecl) node).packge;
         case CLASSDEF:
             return ((JCClassDecl) node).sym;
         case METHODDEF:
@@ -820,6 +827,7 @@
     public static boolean isDeclaration(JCTree node) {
         node = skipParens(node);
         switch (node.getTag()) {
+        case PACKAGEDEF:
         case CLASSDEF:
         case METHODDEF:
         case VARDEF:
--- a/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java	Thu Apr 24 16:04:44 2014 -0700
@@ -116,22 +116,28 @@
 
     /**
      * Create given tree node at current position.
-     * @param defs a list of ClassDef, Import, and Skip
+     * @param defs a list of PackageDef, ClassDef, Import, and Skip
      */
-    public JCCompilationUnit TopLevel(List<JCAnnotation> packageAnnotations,
-                                      JCExpression pid,
-                                      List<JCTree> defs) {
-        Assert.checkNonNull(packageAnnotations);
+    public JCCompilationUnit TopLevel(List<JCTree> defs) {
         for (JCTree node : defs)
             Assert.check(node instanceof JCClassDecl
+                || node instanceof JCPackageDecl
                 || node instanceof JCImport
                 || node instanceof JCSkip
                 || node instanceof JCErroneous
                 || (node instanceof JCExpressionStatement
                     && ((JCExpressionStatement)node).expr instanceof JCErroneous),
                 node.getClass().getSimpleName());
-        JCCompilationUnit tree = new JCCompilationUnit(packageAnnotations, pid, defs,
-                                     null, null, null, null);
+        JCCompilationUnit tree = new JCCompilationUnit(defs);
+        tree.pos = pos;
+        return tree;
+    }
+
+    public JCPackageDecl PackageDecl(List<JCAnnotation> annotations,
+                                     JCExpression pid) {
+        Assert.checkNonNull(annotations);
+        Assert.checkNonNull(pid);
+        JCPackageDecl tree = new JCPackageDecl(annotations, pid);
         tree.pos = pos;
         return tree;
     }
--- a/src/share/classes/com/sun/tools/javac/tree/TreeScanner.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/tree/TreeScanner.java	Thu Apr 24 16:04:44 2014 -0700
@@ -63,9 +63,12 @@
  ****************************************************************************/
 
     public void visitTopLevel(JCCompilationUnit tree) {
-        scan(tree.packageAnnotations);
+        scan(tree.defs);
+    }
+
+    public void visitPackageDef(JCPackageDecl tree) {
+        scan(tree.annotations);
         scan(tree.pid);
-        scan(tree.defs);
     }
 
     public void visitImport(JCImport tree) {
--- a/src/share/classes/com/sun/tools/javac/tree/TreeTranslator.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javac/tree/TreeTranslator.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -56,9 +56,9 @@
             return null;
         } else {
             tree.accept(this);
-            JCTree result = this.result;
+            JCTree tmpResult = this.result;
             this.result = null;
-            return (T)result; // XXX cast
+            return (T)tmpResult; // XXX cast
         }
     }
 
@@ -116,8 +116,13 @@
  ****************************************************************************/
 
     public void visitTopLevel(JCCompilationUnit tree) {
+        tree.defs = translate(tree.defs);
+        result = tree;
+    }
+
+    public void visitPackageDef(JCPackageDecl tree) {
+        tree.annotations = translate(tree.annotations);
         tree.pid = translate(tree.pid);
-        tree.defs = translate(tree.defs);
         result = tree;
     }
 
--- a/src/share/classes/com/sun/tools/javadoc/DocEnv.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javadoc/DocEnv.java	Thu Apr 24 16:04:44 2014 -0700
@@ -743,6 +743,13 @@
         return p;
     }
 
+    TreePath getTreePath(JCCompilationUnit toplevel, JCPackageDecl tree) {
+        TreePath p = treePaths.get(tree);
+        if (p == null)
+            treePaths.put(tree, p = new TreePath(getTreePath(toplevel), tree));
+        return p;
+    }
+
     TreePath getTreePath(JCCompilationUnit toplevel, JCClassDecl tree) {
         TreePath p = treePaths.get(tree);
         if (p == null)
--- a/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java	Thu Apr 24 16:04:44 2014 -0700
@@ -27,6 +27,7 @@
 
 import javax.tools.JavaFileObject;
 
+import com.sun.source.util.TreePath;
 import com.sun.tools.javac.code.Kinds;
 import com.sun.tools.javac.code.Symbol.*;
 import com.sun.tools.javac.comp.Enter;
@@ -84,7 +85,9 @@
     public void visitTopLevel(JCCompilationUnit tree) {
         super.visitTopLevel(tree);
         if (tree.sourcefile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE)) {
-            docenv.makePackageDoc(tree.packge, docenv.getTreePath(tree));
+            JCPackageDecl pd = tree.getPackage();
+            TreePath tp = pd == null ? docenv.getTreePath(tree) : docenv.getTreePath(tree, pd);
+            docenv.makePackageDoc(tree.packge, tp);
         }
     }
 
--- a/src/share/classes/com/sun/tools/sjavac/CleanProperties.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/CleanProperties.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,13 +29,14 @@
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Properties;
 
+import com.sun.tools.sjavac.options.Options;
+
 /**
  * The clean properties transform should not be necessary.
  * Eventually we will cleanup the property file sources in the OpenJDK instead.
@@ -51,7 +52,7 @@
         // Any extra information is ignored for clean properties.
     }
 
-    public void setExtra(String[] a) {
+    public void setExtra(Options a) {
         // Any extra information is ignored for clean properties.
     }
 
--- a/src/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,15 +25,16 @@
 
 package com.sun.tools.sjavac;
 
+import java.io.PrintStream;
 import java.net.URI;
 import java.util.Arrays;
 import java.util.Random;
 import java.util.Set;
 import java.util.Map;
 
+import com.sun.tools.sjavac.options.Options;
 import com.sun.tools.sjavac.server.JavacServer;
 import com.sun.tools.sjavac.server.SysInfo;
-import java.io.PrintStream;
 
 /**
  * This transform compiles a set of packages containing Java sources.
@@ -54,13 +55,12 @@
     // We hope to improve this in the future.
     final static int limitOnConcurrency = 3;
 
-    String serverSettings;
+    Options args;
+
     public void setExtra(String e) {
-        serverSettings = e;
     }
 
-    String[] args;
-    public void setExtra(String[] a) {
+    public void setExtra(Options a) {
         args = a;
     }
 
@@ -82,14 +82,14 @@
         boolean concurrentCompiles = true;
 
         // Fetch the id.
-        String id = Util.extractStringOption("id", serverSettings);
+        String id = Util.extractStringOption("id", args.getServerConf());
         if (id == null || id.equals("")) {
             // No explicit id set. Create a random id so that the requests can be
             // grouped properly in the server.
             id = "id"+(((new Random()).nextLong())&Long.MAX_VALUE);
         }
         // Only keep portfile and sjavac settings..
-        String psServerSettings = Util.cleanSubOptions("--server:", Util.set("portfile","sjavac","background","keepalive"), serverSettings);
+        String psServerSettings = Util.cleanSubOptions(Util.set("portfile","sjavac","background","keepalive"), args.getServerConf());
 
         // Get maximum heap size from the server!
         SysInfo sysinfo = JavacServer.connectGetSysInfo(psServerSettings, out, err);
@@ -223,7 +223,7 @@
                 @Override
                 public void run() {
                                         rn[ii] = JavacServer.useServer(cleanedServerSettings,
-                                                           Main.removeWrapperArgs(args),
+                                                           args.prepJavacArgs(),
                                                                cc.srcs,
                                                            fvisible_sources,
                                                            fvisible_classes,
--- a/src/share/classes/com/sun/tools/sjavac/CompileProperties.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/CompileProperties.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,8 @@
 import java.util.HashSet;
 import java.util.Map;
 
+import com.sun.tools.sjavac.options.Options;
+
 /**
  * Compile properties transform a properties file into a Java source file.
  * Java has built in support for reading properties from either a text file
@@ -58,7 +60,7 @@
         extra = e;
     }
 
-    public void setExtra(String[] a) {
+    public void setExtra(Options a) {
     }
 
     public boolean transform(Map<String,Set<URI>> pkgSrcs,
--- a/src/share/classes/com/sun/tools/sjavac/CopyFile.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/CopyFile.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,8 @@
 import java.util.HashSet;
 import java.util.Map;
 
+import com.sun.tools.sjavac.options.Options;
+
 /**
  * The copy file transform simply copies a matching file from -src to -d .
  * Such files are typically images, xml documents and other data files.
@@ -45,7 +47,7 @@
     public void setExtra(String e) {
     }
 
-    public void setExtra(String[] a) {
+    public void setExtra(Options a) {
     }
 
     public boolean transform(Map<String,Set<URI>> pkgSrcs,
--- a/src/share/classes/com/sun/tools/sjavac/JavacState.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/JavacState.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
 package com.sun.tools.sjavac;
 
 import java.io.*;
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Set;
@@ -37,6 +38,9 @@
 import java.net.URI;
 import java.util.*;
 
+import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.options.SourceLocation;
+
 /**
  * The javac state class maintains the previous (prev) and the current (now)
  * build states and everything else that goes into the javac_state file.
@@ -117,25 +121,20 @@
     // It can also map from a jar file to the set of visible classes for that jar file.
     Map<URI,Set<String>> visibleClasses;
 
-    // Setup two transforms that always exist.
-    private CopyFile            copyFiles = new CopyFile();
+    // Setup transform that always exist.
     private CompileJavaPackages compileJavaPackages = new CompileJavaPackages();
 
     // Where to send stdout and stderr.
     private PrintStream out, err;
 
-    JavacState(String[] args, File bd, File gd, File hd, boolean permitUnidentifiedArtifacts, boolean removeJavacState,
-            PrintStream o, PrintStream e) {
+    JavacState(Options options, boolean removeJavacState, PrintStream o, PrintStream e) {
         out = o;
         err = e;
-        numCores = Main.findNumberOption(args, "-j");
-        theArgs = "";
-        for (String a : removeArgsNotAffectingState(args)) {
-            theArgs = theArgs+a+" ";
-        }
-        binDir = bd;
-        gensrcDir = gd;
-        headerDir = hd;
+        numCores = options.getNumCores();
+        theArgs = options.getStateArgsString();
+        binDir = Util.pathToFile(options.getDestDir());
+        gensrcDir = Util.pathToFile(options.getGenSrcDir());
+        headerDir = Util.pathToFile(options.getHeaderDir());
         javacStateFilename = binDir.getPath()+File.separator+"javac_state";
         javacState = new File(javacStateFilename);
         if (removeJavacState && javacState.exists()) {
@@ -148,7 +147,7 @@
             // We do not want to risk building a broken incremental build.
             // BUT since the makefiles still copy things straight into the bin_dir et al,
             // we avoid deleting files here, if the option --permit-unidentified-classes was supplied.
-            if (!permitUnidentifiedArtifacts) {
+            if (!options.isUnidentifiedArtifactPermitted()) {
                 deleteContents(binDir);
                 deleteContents(gensrcDir);
                 deleteContents(headerDir);
@@ -301,9 +300,8 @@
     /**
      * Load a javac_state file.
      */
-    public static JavacState load(String[] args, File binDir, File gensrcDir, File headerDir,
-            boolean permitUnidentifiedArtifacts, PrintStream out, PrintStream err) {
-        JavacState db = new JavacState(args, binDir, gensrcDir, headerDir, permitUnidentifiedArtifacts, false, out, err);
+    public static JavacState load(Options options, PrintStream out, PrintStream err) {
+        JavacState db = new JavacState(options, false, out, err);
         Module  lastModule = null;
         Package lastPackage = null;
         Source  lastSource = null;
@@ -370,22 +368,22 @@
             noFileFound = true;
         } catch (IOException e) {
             Log.info("Dropping old javac_state because of errors when reading it.");
-            db = new JavacState(args, binDir, gensrcDir, headerDir, permitUnidentifiedArtifacts, true, out, err);
+            db = new JavacState(options, true, out, err);
             foundCorrectVerNr = true;
             newCommandLine = false;
             syntaxError = false;
     }
         if (foundCorrectVerNr == false && !noFileFound) {
             Log.info("Dropping old javac_state since it is of an old version.");
-            db = new JavacState(args, binDir, gensrcDir, headerDir, permitUnidentifiedArtifacts, true, out, err);
+            db = new JavacState(options, true, out, err);
         } else
         if (newCommandLine == true && !noFileFound) {
             Log.info("Dropping old javac_state since a new command line is used!");
-            db = new JavacState(args, binDir, gensrcDir, headerDir, permitUnidentifiedArtifacts, true, out, err);
+            db = new JavacState(options, true, out, err);
         } else
         if (syntaxError == true) {
             Log.info("Dropping old javac_state since it contains syntax errors.");
-            db = new JavacState(args, binDir, gensrcDir, headerDir, permitUnidentifiedArtifacts, true, out, err);
+            db = new JavacState(options, true, out, err);
         }
         db.prev.calculateDependents();
         return db;
@@ -467,12 +465,6 @@
         return sr;
     }
 
-    /**
-     * Acquire the copying transform.
-     */
-    public Transformer getCopier() {
-        return copyFiles;
-    }
 
     /**
      * If artifacts have gone missing, force a recompile of the packages
@@ -629,7 +621,7 @@
     public void performCopying(File binDir, Map<String,Transformer> suffixRules) {
         Map<String,Transformer> sr = new HashMap<>();
         for (Map.Entry<String,Transformer> e : suffixRules.entrySet()) {
-            if (e.getValue() == copyFiles) {
+            if (e.getValue().getClass().equals(CopyFile.class)) {
                 sr.put(e.getKey(), e.getValue());
             }
         }
@@ -643,10 +635,11 @@
     public void performTranslation(File gensrcDir, Map<String,Transformer> suffixRules) {
         Map<String,Transformer> sr = new HashMap<>();
         for (Map.Entry<String,Transformer> e : suffixRules.entrySet()) {
-            if (e.getValue() != copyFiles &&
-                e.getValue() != compileJavaPackages) {
-                sr.put(e.getKey(), e.getValue());
-            }
+            Class<?> trClass = e.getValue().getClass();
+            if (trClass == CompileJavaPackages.class || trClass == CopyFile.class)
+                continue;
+
+            sr.put(e.getKey(), e.getValue());
         }
         perform(gensrcDir, sr);
     }
@@ -654,14 +647,11 @@
     /**
      * Compile all the java sources. Return true, if it needs to be called again!
      */
-    public boolean performJavaCompilations(File binDir,
-                                           String serverSettings,
-                                           String[] args,
+    public boolean performJavaCompilations(Options args,
                                            Set<String> recentlyCompiled,
                                            boolean[] rcValue) {
         Map<String,Transformer> suffixRules = new HashMap<>();
         suffixRules.put(".java", compileJavaPackages);
-        compileJavaPackages.setExtra(serverSettings);
         compileJavaPackages.setExtra(args);
 
         rcValue[0] = perform(binDir, suffixRules);
@@ -813,7 +803,10 @@
         for (Source s : now.sources().values()) {
             // Don't include link only sources when comparing sources to compile
             if (!s.isLinkedOnly()) {
-                calculatedSources.add(s.file().getPath());
+                String path = s.file().getPath();
+                if (mightNeedRewriting)
+                    path = Util.normalizeDriveLetter(path);
+                calculatedSources.add(path);
             }
         }
         // Read in the file and create another set of filenames with full paths.
--- a/src/share/classes/com/sun/tools/sjavac/Log.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/Log.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -71,17 +71,19 @@
         err.println(msg);
     }
 
-    static public void setLogLevel(String l, PrintStream o, PrintStream e)
-        throws ProblemException {
+    static public void initializeLog(PrintStream o, PrintStream e) {
         out = o;
         err = e;
+    }
+
+    static public void setLogLevel(String l) {
         switch (l) {
             case "warn": level = WARN; break;
             case "info": level = INFO; break;
             case "debug": level = DEBUG; break;
             case "trace": level = TRACE; break;
             default:
-                throw new ProblemException("No such log level \"" + l + "\"");
+                throw new IllegalArgumentException("No such log level \"" + l + "\"");
         }
     }
 
--- a/src/share/classes/com/sun/tools/sjavac/Main.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/Main.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,13 +25,14 @@
 
 package com.sun.tools.sjavac;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.nio.file.Path;
+import java.nio.file.Files;
 
+import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.options.SourceLocation;
 import com.sun.tools.sjavac.server.JavacServer;
 
 /**
@@ -151,24 +152,8 @@
         The resulting classes are written into bin.
     */
 
-    // This is the final destination for classes and copied files.
-    private File bin_dir;
-    // This is where the annotation process will put generated sources.
-    private File gensrc_dir;
-    // This is where javac -h puts the generated c-header files.
-    private File header_dir;
-
-    // This file contains the list of sources genereated by the makefile.
-    // We double check that our calculated list of sources matches this list,
-    // if not, then we terminate with an error!
-    private File makefile_source_list;
-    // The challenging task to manage an incremental build is done by javac_state.
     private JavacState javac_state;
 
-    // The suffix rules tells you for example, that .java files should be compiled,
-    // and .html files should be copied and .properties files be translated.
-    Map<String,Transformer> suffix_rules;
-
     public static void main(String... args)  {
         if (args.length > 0 && args[0].startsWith("--startserver:")) {
             if (args.length>1) {
@@ -199,118 +184,142 @@
     }
 
     public int go(String[] args, PrintStream out, PrintStream err) {
+
+        Log.initializeLog(out, err);
+
+        Options options;
         try {
-            if (args.length == 0 || findJavaSourceFiles(args) || findAtFile(args) || null==Util.findServerSettings(args)) {
-                printHelp();
-                return 0;
-            }
+            options = Options.parseArgs(args);
+        } catch (IllegalArgumentException e) {
+            Log.error(e.getMessage());
+            return -1;
+        }
 
-            Log.setLogLevel(findLogLevel(args), out, err);
-            String server_settings = Util.findServerSettings(args);
-            args = verifyImplicitOption(args);
-            // Find the source root directories, and add the -src option before these, if not there already.
-            args = addSrcBeforeDirectories(args);
-            // Check that there is at least one -src supplied.
-            checkSrcOption(args);
-            // Check that there is one -d supplied.
-            bin_dir = findDirectoryOption(args,"-d","output", true, false, true);
-            gensrc_dir = findDirectoryOption(args,"-s","gensrc", false, false, true);
-            header_dir = findDirectoryOption(args,"-h","headers", false, false, true);
-            makefile_source_list = findFileOption(args,"--compare-found-sources","makefile source list", false);
+        Log.setLogLevel(options.getLogLevel());
 
-            // Load the prev build state database.
-            javac_state = JavacState.load(args, bin_dir, gensrc_dir, header_dir,
-                    findBooleanOption(args, "--permit-unidentified-artifacts"), out, err);
+        if (!validateOptions(options))
+            return -1;
 
-            // Setup the suffix rules from the command line.
-            suffix_rules = javac_state.getJavaSuffixRule();
-            findTranslateOptions(args, suffix_rules);
-            if (suffix_rules.keySet().size() > 1 && gensrc_dir == null) {
-                Log.error("You have translators but no gensrc dir (-s) specified!");
-                return -1;
-            }
-            findCopyOptions(args, suffix_rules);
+        if (!createIfMissing(options.getDestDir()))
+            return -1;
 
-            // All found modules are put here.
-            Map<String,Module> modules = new HashMap<>();
-            // We start out in the legacy empty no-name module.
-            // As soon as we stumble on a module-info.java file we change to that module.
-            Module current_module = new Module("", "");
-            modules.put("", current_module);
+        Path gensrc = options.getGenSrcDir();
+        if (gensrc != null && !createIfMissing(gensrc))
+            return -1;
 
-            // Find all sources, use the suffix rules to know which files are sources.
-            Map<String,Source> sources = new HashMap<>();
-            // Find the files, this will automatically populate the found modules
-            // with found packages where the sources are found!
-            findFiles(args, "-src", suffix_rules.keySet(), sources, modules, current_module, false);
+        Path hdrdir = options.getHeaderDir();
+        if (hdrdir != null && !createIfMissing(hdrdir))
+            return -1;
 
-            if (sources.isEmpty()) {
-                Log.error("Found nothing to compile!");
-                return -1;
-            }
+        // Load the prev build state database.
+        javac_state = JavacState.load(options, out, err);
 
-            // Create a map of all source files that are available for linking. Both -src and
-            // -sourcepath point to such files. It is possible to specify multiple
-            // -sourcepath options to enable different filtering rules. If the
-            // filters are the same for multiple sourcepaths, they may be concatenated
-            // using :(;). Before sending the list of sourcepaths to javac, they are
-            // all concatenated. The list created here is used by the SmartFileWrapper to
-            // make sure only the correct sources are actually available.
-            // We might find more modules here as well.
-            Map<String,Source> sources_to_link_to = new HashMap<>();
-            findFiles(args, "-src", Util.set(".java"), sources_to_link_to, modules, current_module, true);
-            findFiles(args, "-sourcepath", Util.set(".java"), sources_to_link_to, modules, current_module, true);
-            // Rewrite the -src option to make it through to the javac instances.
-            rewriteOptions(args, "-src", "-sourcepath");
+        // Setup the suffix rules from the command line.
+        Map<String, Transformer> suffixRules = new HashMap<>();
 
-            // Find all class files allowable for linking.
-            // And pickup knowledge of all modules found here.
-            // This cannot currently filter classes inside jar files.
-//          Map<String,Source> classes_to_link_to = new HashMap<String,Source>();
-//          findFiles(args, "-classpath", Util.set(".class"), classes_to_link_to, modules, current_module, true);
+        // Handling of .java-compilation
+        suffixRules.putAll(javac_state.getJavaSuffixRule());
 
-            // Find all module sources allowable for linking.
-//          Map<String,Source> modules_to_link_to = new HashMap<String,Source>();
-//          findFiles(args, "-modulepath", Util.set(".class"), modules_to_link_to, modules, current_module, true);
+        // Handling of -copy and -tr
+        suffixRules.putAll(options.getTranslationRules());
 
-            // Add the set of sources to the build database.
-            javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
-            javac_state.now().checkInternalState("checking sources", false, sources);
-            javac_state.now().checkInternalState("checking linked sources", true, sources_to_link_to);
-            javac_state.setVisibleSources(sources_to_link_to);
+        // All found modules are put here.
+        Map<String,Module> modules = new HashMap<>();
+        // We start out in the legacy empty no-name module.
+        // As soon as we stumble on a module-info.java file we change to that module.
+        Module current_module = new Module("", "");
+        modules.put("", current_module);
 
-            // If there is any change in the source files, taint packages
-            // and mark the database in need of saving.
-            javac_state.checkSourceStatus(false);
+        // Find all sources, use the suffix rules to know which files are sources.
+        Map<String,Source> sources = new HashMap<>();
 
-            // Find all existing artifacts. Their timestamp will match the last modified timestamps stored
-            // in javac_state, simply because loading of the JavacState will clean out all artifacts
-            // that do not match the javac_state database.
-            javac_state.findAllArtifacts();
+        // Find the files, this will automatically populate the found modules
+        // with found packages where the sources are found!
+        findSourceFiles(options.getSources(),
+                        suffixRules.keySet(),
+                        sources,
+                        modules,
+                        current_module,
+                        options.isDefaultPackagePermitted(),
+                        false);
 
-            // Remove unidentified artifacts from the bin, gensrc and header dirs.
-            // (Unless we allow them to be there.)
-            // I.e. artifacts that are not known according to the build database (javac_state).
-            // For examples, files that have been manually copied into these dirs.
-            // Artifacts with bad timestamps (ie the on disk timestamp does not match the timestamp
-            // in javac_state) have already been removed when the javac_state was loaded.
-            if (!findBooleanOption(args, "--permit-unidentified-artifacts")) {
-                javac_state.removeUnidentifiedArtifacts();
-            }
-            // Go through all sources and taint all packages that miss artifacts.
-            javac_state.taintPackagesThatMissArtifacts();
+        if (sources.isEmpty()) {
+            Log.error("Found nothing to compile!");
+            return -1;
+        }
 
-            // Now clean out all known artifacts belonging to tainted packages.
-            javac_state.deleteClassArtifactsInTaintedPackages();
-            // Copy files, for example property files, images files, xml files etc etc.
-            javac_state.performCopying(bin_dir, suffix_rules);
-            // Translate files, for example compile properties or compile idls.
-            javac_state.performTranslation(gensrc_dir, suffix_rules);
-            // Add any potentially generated java sources to the tobe compiled list.
-            // (Generated sources must always have a package.)
-            Map<String,Source> generated_sources = new HashMap<>();
-            Source.scanRoot(gensrc_dir, Util.set(".java"), null, null, null, null,
-                   generated_sources, modules, current_module, false, true, false);
+        // Create a map of all source files that are available for linking. Both -src and
+        // -sourcepath point to such files. It is possible to specify multiple
+        // -sourcepath options to enable different filtering rules. If the
+        // filters are the same for multiple sourcepaths, they may be concatenated
+        // using :(;). Before sending the list of sourcepaths to javac, they are
+        // all concatenated. The list created here is used by the SmartFileWrapper to
+        // make sure only the correct sources are actually available.
+        // We might find more modules here as well.
+        Map<String,Source> sources_to_link_to = new HashMap<>();
+
+        List<SourceLocation> sourceResolutionLocations = new ArrayList<>();
+        sourceResolutionLocations.addAll(options.getSources());
+        sourceResolutionLocations.addAll(options.getSourceSearchPaths());
+        findSourceFiles(sourceResolutionLocations,
+                        Collections.singleton(".java"),
+                        sources_to_link_to,
+                        modules,
+                        current_module,
+                        options.isDefaultPackagePermitted(),
+                        true);
+
+        // Find all class files allowable for linking.
+        // And pickup knowledge of all modules found here.
+        // This cannot currently filter classes inside jar files.
+//      Map<String,Source> classes_to_link_to = new HashMap<String,Source>();
+//      findFiles(args, "-classpath", Util.set(".class"), classes_to_link_to, modules, current_module, true);
+
+        // Find all module sources allowable for linking.
+//      Map<String,Source> modules_to_link_to = new HashMap<String,Source>();
+//      findFiles(args, "-modulepath", Util.set(".class"), modules_to_link_to, modules, current_module, true);
+
+        // Add the set of sources to the build database.
+        javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
+        javac_state.now().checkInternalState("checking sources", false, sources);
+        javac_state.now().checkInternalState("checking linked sources", true, sources_to_link_to);
+        javac_state.setVisibleSources(sources_to_link_to);
+
+        // If there is any change in the source files, taint packages
+        // and mark the database in need of saving.
+        javac_state.checkSourceStatus(false);
+
+        // Find all existing artifacts. Their timestamp will match the last modified timestamps stored
+        // in javac_state, simply because loading of the JavacState will clean out all artifacts
+        // that do not match the javac_state database.
+        javac_state.findAllArtifacts();
+
+        // Remove unidentified artifacts from the bin, gensrc and header dirs.
+        // (Unless we allow them to be there.)
+        // I.e. artifacts that are not known according to the build database (javac_state).
+        // For examples, files that have been manually copied into these dirs.
+        // Artifacts with bad timestamps (ie the on disk timestamp does not match the timestamp
+        // in javac_state) have already been removed when the javac_state was loaded.
+        if (!options.isUnidentifiedArtifactPermitted()) {
+            javac_state.removeUnidentifiedArtifacts();
+        }
+        // Go through all sources and taint all packages that miss artifacts.
+        javac_state.taintPackagesThatMissArtifacts();
+
+        // Now clean out all known artifacts belonging to tainted packages.
+        javac_state.deleteClassArtifactsInTaintedPackages();
+        // Copy files, for example property files, images files, xml files etc etc.
+        javac_state.performCopying(Util.pathToFile(options.getDestDir()), suffixRules);
+        // Translate files, for example compile properties or compile idls.
+        javac_state.performTranslation(Util.pathToFile(gensrc), suffixRules);
+        // Add any potentially generated java sources to the tobe compiled list.
+        // (Generated sources must always have a package.)
+        Map<String,Source> generated_sources = new HashMap<>();
+
+        try {
+
+            Source.scanRoot(Util.pathToFile(options.getGenSrcDir()), Util.set(".java"), null, null, null, null,
+                    generated_sources, modules, current_module, false, true, false);
             javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
             // Recheck the the source files and their timestamps again.
             javac_state.checkSourceStatus(true);
@@ -320,7 +329,7 @@
             // right, then incremental builds will fail with subtility.
             // If any difference is detected, then we will fail hard here.
             // This is an important safety net.
-            javac_state.compareWithMakefileList(makefile_source_list);
+            javac_state.compareWithMakefileList(Util.pathToFile(options.getSourceReferenceList()));
 
             // Do the compilations, repeatedly until no tainted packages exist.
             boolean again;
@@ -330,7 +339,7 @@
             do {
                 // Clean out artifacts in tainted packages.
                 javac_state.deleteClassArtifactsInTaintedPackages();
-                again = javac_state.performJavaCompilations(bin_dir, server_settings, args, recently_compiled, rc);
+                again = javac_state.performJavaCompilations(options, recently_compiled, rc);
                 if (!rc[0]) break;
             } while (again);
             // Only update the state if the compile went well.
@@ -351,620 +360,71 @@
         }
     }
 
-    /**
-     * Are java source files passed on the command line?
-     */
-    private boolean findJavaSourceFiles(String[] args) {
-        String prev = "";
-        for (String s : args) {
-            if (s.endsWith(".java") && !prev.equals("-xf") && !prev.equals("-if")) {
-                return true;
-            }
-            prev = s;
+    private static boolean validateOptions(Options options) {
+
+        String err = null;
+
+        if (options.getDestDir() == null) {
+            err = "Please specify output directory.";
+        } else if (options.isJavaFilesAmongJavacArgs()) {
+            err = "Sjavac does not handle explicit compilation of single .java files.";
+        } else if (options.isAtFilePresent()) {
+            err = "Sjavac does not handle @-files.";
+        } else if (options.getServerConf() == null) {
+            err = "No server configuration provided.";
+        } else if (!options.getImplicitPolicy().equals("none")) {
+            err = "The only allowed setting for sjavac is -implicit:none";
+        } else if (options.getSources().isEmpty()) {
+            err = "You have to specify -src.";
+        } else if (options.getTranslationRules().size() > 1
+                && options.getGenSrcDir() == null) {
+            err = "You have translators but no gensrc dir (-s) specified!";
         }
-        return false;
+
+        if (err != null)
+            Log.error(err);
+
+        return err == null;
+
     }
 
-    /**
-     * Is an at file passed on the command line?
-     */
-    private boolean findAtFile(String[] args) {
-        for (String s : args) {
-            if (s.startsWith("@")) {
-                return true;
-            }
+    private static boolean createIfMissing(Path dir) {
+
+        if (Files.isDirectory(dir))
+            return true;
+
+        if (Files.exists(dir)) {
+            Log.error(dir + " is not a directory.");
+            return false;
         }
-        return false;
-    }
 
-    /**
-     * Find the log level setting.
-     */
-    private String findLogLevel(String[] args) {
-        for (String s : args) {
-            if (s.startsWith("--log=") && s.length()>6) {
-                return s.substring(6);
-            }
-            if (s.equals("-verbose")) {
-                return "info";
-            }
+        try {
+            Files.createDirectories(dir);
+        } catch (IOException e) {
+            Log.error("Could not create directory: " + e.getMessage());
+            return false;
         }
-        return "info";
-    }
 
-    /**
-     * Remove smart javac wrapper arguments, before feeding
-     * the args to the plain javac.
-     */
-    static String[] removeWrapperArgs(String[] args) {
-        String[] out = new String[args.length];
-        // The first source path index is remembered
-        // here. So that all following can be concatenated to it.
-        int source_path = -1;
-        // The same for class path.
-        int class_path = -1;
-        // And module path.
-        int module_path = -1;
-        int j = 0;
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals("-src") ||
-                args[i].equals("-x") ||
-                args[i].equals("-i") ||
-                args[i].equals("-xf") ||
-                args[i].equals("-if") ||
-                args[i].equals("-copy") ||
-                args[i].equals("-tr") ||
-                args[i].equals("-j")) {
-                // Just skip it and skip following value
-                i++;
-            } else if (args[i].startsWith("--server:")) {
-                // Just skip it.
-            } else if (args[i].startsWith("--log=")) {
-                // Just skip it.
-            } else if (args[i].equals("--permit-unidentified-artifacts")) {
-                // Just skip it.
-            } else if (args[i].equals("--permit-sources-without-package")) {
-                // Just skip it.
-            } else if (args[i].equals("--compare-found-sources")) {
-                // Just skip it and skip verify file name
-                i++;
-            } else if (args[i].equals("-sourcepath")) {
-                if (source_path == -1) {
-                    source_path = j;
-                    out[j] = args[i];
-                    out[j+1] = args[i+1];
-                    j+=2;
-                    i++;
-                } else {
-                    // Skip this and its argument, but
-                    // append argument to found sourcepath.
-                    out[source_path+1] = out[source_path+1]+File.pathSeparatorChar+args[i+1];
-                    i++;
-                }
-            } else if (args[i].equals("-classpath") || args[i].equals("-cp")) {
-                if (class_path == -1) {
-                    class_path = j;
-                    out[j] = args[i];
-                    out[j+1] = args[i+1];
-                    j+=2;
-                    i++;
-                } else {
-                    // Skip this and its argument, but
-                    // append argument to found sourcepath.
-                    out[class_path+1] = out[class_path+1]+File.pathSeparatorChar+args[i+1];
-                    i++;
-                }
-            } else if (args[i].equals("-modulepath")) {
-                if (module_path == -1) {
-                    module_path = j;
-                    out[j] = args[i];
-                    out[j+1] = args[i+1];
-                    j+=2;
-                    i++;
-                } else {
-                    // Skip this and its argument, but
-                    // append argument to found sourcepath.
-                    out[module_path+1] = out[module_path+1]+File.pathSeparatorChar+args[i+1];
-                    i++;
-                }
-             } else {
-                // Copy argument.
-                out[j] = args[i];
-                j++;
-            }
-        }
-        String[] ret = new String[j];
-        System.arraycopy(out, 0, ret, 0, j);
-        return ret;
-    }
-
-    /**
-     * Make sure directory exist, create it if not.
-     */
-    private static boolean makeSureExists(File dir) {
-        // Make sure the dest directories exist.
-        if (!dir.exists()) {
-            if (!dir.mkdirs()) {
-                Log.error("Could not create the directory "+dir.getPath());
-                return false;
-            }
-        }
         return true;
     }
 
-    /**
-     * Verify that a package pattern is valid.
-     */
-    private static void checkPattern(String s) throws ProblemException {
-        // Package names like foo.bar.gamma are allowed, and
-        // package names suffixed with .* like foo.bar.* are
-        // also allowed.
-        Pattern p = Pattern.compile("[a-zA-Z_]{1}[a-zA-Z0-9_]*(\\.[a-zA-Z_]{1}[a-zA-Z0-9_]*)*(\\.\\*)?+");
-        Matcher m = p.matcher(s);
-        if (!m.matches()) {
-            throw new ProblemException("The string \""+s+"\" is not a proper package name pattern.");
+
+    /** Find source files in the given source locations. */
+    public static void findSourceFiles(List<SourceLocation> sourceLocations,
+                                       Set<String> sourceTypes,
+                                       Map<String,Source> foundFiles,
+                                       Map<String, Module> foundModules,
+                                       Module currentModule,
+                                       boolean permitSourcesInDefaultPackage,
+                                       boolean inLinksrc) {
+
+        for (SourceLocation source : sourceLocations) {
+            source.findSourceFiles(sourceTypes,
+                                   foundFiles,
+                                   foundModules,
+                                   currentModule,
+                                   permitSourcesInDefaultPackage,
+                                   inLinksrc);
         }
     }
-
-    /**
-     * Verify that a translate pattern is valid.
-     */
-    private static void checkTranslatePattern(String s) throws ProblemException {
-        // .prop=com.sun.tools.javac.smart.CompileProperties
-        // .idl=com.sun.corba.CompileIdl
-        // .g3=antlr.CompileGrammar,debug=true
-        Pattern p = Pattern.compile(
-            "\\.[a-zA-Z_]{1}[a-zA-Z0-9_]*=[a-z_]{1}[a-z0-9_]*(\\.[a-z_]{1}[a-z0-9_]*)*"+
-            "(\\.[a-zA-Z_]{1}[a-zA-Z0-9_]*)(,.*)?");
-        Matcher m = p.matcher(s);
-        if (!m.matches()) {
-            throw new ProblemException("The string \""+s+"\" is not a proper translate pattern.");
-        }
-    }
-
-    /**
-     * Verify that a copy pattern is valid.
-     */
-    private static void checkCopyPattern(String s) throws ProblemException {
-        // .gif
-        // .html
-        Pattern p = Pattern.compile(
-            "\\.[a-zA-Z_]{1}[a-zA-Z0-9_]*");
-        Matcher m = p.matcher(s);
-        if (!m.matches()) {
-            throw new ProblemException("The string \""+s+"\" is not a proper suffix.");
-        }
-    }
-
-    /**
-     * Verify that a source file name is valid.
-     */
-    private static void checkFilePattern(String s) throws ProblemException {
-        // File names like foo/bar/gamma/Bar.java are allowed,
-        // as well as /bar/jndi.properties as well as,
-        // */bar/Foo.java
-        Pattern p = null;
-        if (File.separatorChar == '\\') {
-            p = Pattern.compile("\\*?(.+\\\\)*.+");
-        }
-        else if (File.separatorChar == '/') {
-            p = Pattern.compile("\\*?(.+/)*.+");
-        } else {
-            throw new ProblemException("This platform uses the unsupported "+File.separatorChar+
-                                      " as file separator character. Please add support for it!");
-        }
-        Matcher m = p.matcher(s);
-        if (!m.matches()) {
-            throw new ProblemException("The string \""+s+"\" is not a proper file name.");
-        }
-    }
-
-    /**
-     * Scan the arguments to find an option is used.
-     */
-    private static boolean hasOption(String[] args, String option) {
-        for (String a : args) {
-            if (a.equals(option)) return true;
-        }
-        return false;
-    }
-
-    /**
-     * Check if -implicit is supplied, if so check that it is none.
-     * If -implicit is not supplied, supply -implicit:none
-     * Only implicit:none is allowed because otherwise the multicore compilations
-     * and dependency tracking will be tangled up.
-     */
-    private static String[] verifyImplicitOption(String[] args)
-        throws ProblemException {
-
-        boolean foundImplicit = false;
-        for (String a : args) {
-            if (a.startsWith("-implicit:")) {
-                foundImplicit = true;
-                if (!a.equals("-implicit:none")) {
-                    throw new ProblemException("The only allowed setting for sjavac is -implicit:none, it is also the default.");
-                }
-            }
-        }
-        if (foundImplicit) {
-            return args;
-        }
-        // -implicit:none not found lets add it.
-        String[] newargs = new String[args.length+1];
-        System.arraycopy(args,0, newargs, 0, args.length);
-        newargs[args.length] = "-implicit:none";
-        return newargs;
-    }
-
-    /**
-     * Rewrite a single option into something else.
-     */
-    private static void rewriteOptions(String[] args, String option, String new_option) {
-        for (int i=0; i<args.length; ++i) {
-            if (args[i].equals(option)) {
-                args[i] = new_option;
-            }
-        }
-    }
-
-    /**
-     * Scan the arguments to find an option that specifies a directory.
-     * Create the directory if necessary.
-     */
-    private static File findDirectoryOption(String[] args, String option, String name, boolean needed, boolean allow_dups, boolean create)
-        throws ProblemException, ProblemException {
-        File dir = null;
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals(option)) {
-                if (dir != null) {
-                    throw new ProblemException("You have already specified the "+name+" dir!");
-                }
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a directory following "+option+".");
-                }
-                if (args[i+1].indexOf(File.pathSeparatorChar) != -1) {
-                    throw new ProblemException("You must only specify a single directory for "+option+".");
-                }
-                dir = new File(args[i+1]);
-                if (!dir.exists()) {
-                    if (!create) {
-                         throw new ProblemException("This directory does not exist: "+dir.getPath());
-                    } else
-                    if (!makeSureExists(dir)) {
-                        throw new ProblemException("Cannot create directory "+dir.getPath());
-                    }
-                }
-                if (!dir.isDirectory()) {
-                    throw new ProblemException("\""+args[i+1]+"\" is not a directory.");
-                }
-            }
-        }
-        if (dir == null && needed) {
-            throw new ProblemException("You have to specify "+option);
-        }
-        try {
-            if (dir != null)
-                return dir.getCanonicalFile();
-        } catch (IOException e) {
-            throw new ProblemException(""+e);
-        }
-        return null;
-    }
-
-    /**
-     * Option is followed by path.
-     */
-    private static boolean shouldBeFollowedByPath(String o) {
-        return o.equals("-s") ||
-               o.equals("-h") ||
-               o.equals("-d") ||
-               o.equals("-sourcepath") ||
-               o.equals("-classpath") ||
-               o.equals("-cp") ||
-               o.equals("-bootclasspath") ||
-               o.equals("-src");
-    }
-
-    /**
-     * Add -src before source root directories if not already there.
-     */
-    private static String[] addSrcBeforeDirectories(String[] args) {
-        List<String> newargs = new ArrayList<>();
-        for (int i = 0; i<args.length; ++i) {
-            File dir = new File(args[i]);
-            if (dir.exists() && dir.isDirectory()) {
-                if (i == 0 || !shouldBeFollowedByPath(args[i-1])) {
-                    newargs.add("-src");
-                }
-            }
-            newargs.add(args[i]);
-        }
-        return newargs.toArray(new String[0]);
-    }
-
-    /**
-     * Check the -src options.
-     */
-    private static void checkSrcOption(String[] args)
-        throws ProblemException {
-        Set<File> dirs = new HashSet<>();
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals("-src")) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a directory following -src.");
-                }
-                StringTokenizer st = new StringTokenizer(args[i+1], File.pathSeparator);
-                while (st.hasMoreElements()) {
-                    File dir = new File(st.nextToken());
-                    if (!dir.exists()) {
-                        throw new ProblemException("This directory does not exist: "+dir.getPath());
-                    }
-                    if (!dir.isDirectory()) {
-                        throw new ProblemException("\""+dir.getPath()+"\" is not a directory.");
-                    }
-                    if (dirs.contains(dir)) {
-                        throw new ProblemException("The src directory \""+dir.getPath()+"\" is specified more than once!");
-                    }
-                    dirs.add(dir);
-                }
-            }
-        }
-        if (dirs.isEmpty()) {
-            throw new ProblemException("You have to specify -src.");
-        }
-    }
-
-    /**
-     * Scan the arguments to find an option that specifies a file.
-     */
-    private static File findFileOption(String[] args, String option, String name, boolean needed)
-        throws ProblemException, ProblemException {
-        File file = null;
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals(option)) {
-                if (file != null) {
-                    throw new ProblemException("You have already specified the "+name+" file!");
-                }
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a file following "+option+".");
-                }
-                file = new File(args[i+1]);
-                if (file.isDirectory()) {
-                    throw new ProblemException("\""+args[i+1]+"\" is not a file.");
-                }
-                if (!file.exists() && needed) {
-                    throw new ProblemException("The file \""+args[i+1]+"\" does not exist.");
-                }
-
-            }
-        }
-        if (file == null && needed) {
-            throw new ProblemException("You have to specify "+option);
-        }
-        return file;
-    }
-
-    /**
-     * Look for a specific switch, return true if found.
-     */
-    public static boolean findBooleanOption(String[] args, String option) {
-        for (String arg : args) {
-            if (arg.equals(option))
-                return true;
-        }
-        return false;
-    }
-
-    /**
-     * Scan the arguments to find an option that specifies a number.
-     */
-    public static int findNumberOption(String[] args, String option) {
-        int rc = 0;
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals(option)) {
-                if (args.length > i+1) {
-                    rc = Integer.parseInt(args[i+1]);
-                }
-            }
-        }
-        return rc;
-    }
-
-    /**
-     * Scan the arguments to find the option (-tr) that setup translation rules to java source
-     * from different sources. For example: .properties are translated using CompileProperties
-     * The found translators are stored as suffix rules.
-     */
-    private static void findTranslateOptions(String[] args, Map<String,Transformer> suffix_rules)
-        throws ProblemException, ProblemException {
-
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals("-tr")) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a translate rule following -tr.");
-                }
-                String s = args[i+1];
-                checkTranslatePattern(s);
-                int ep = s.indexOf("=");
-                String suffix = s.substring(0,ep);
-                String classname = s.substring(ep+1);
-                if (suffix_rules.get(suffix) != null) {
-                    throw new ProblemException("You have already specified a "+
-                                              "rule for the suffix "+suffix);
-                }
-                if (s.equals(".class")) {
-                    throw new ProblemException("You cannot have a translator for .class files!");
-                }
-                if (s.equals(".java")) {
-                    throw new ProblemException("You cannot have a translator for .java files!");
-                }
-                String extra = null;
-                int exp = classname.indexOf(",");
-                if (exp != -1) {
-                    extra = classname.substring(exp+1);
-                    classname = classname.substring(0,exp);
-                }
-                try {
-                    Class<?> cl = Class.forName(classname);
-                    Transformer t = (Transformer)cl.newInstance();
-                    t.setExtra(extra);
-                    suffix_rules.put(suffix, t);
-                }
-                catch (Exception e) {
-                    throw new ProblemException("Cannot use "+classname+" as a translator!");
-                }
-            }
-        }
-    }
-
-    /**
-     * Scan the arguments to find the option (-copy) that setup copying rules into the bin dir.
-     * For example: -copy .html
-     * The found copiers are stored as suffix rules as well. No translation is done, just copying.
-     */
-    private void findCopyOptions(String[] args, Map<String,Transformer> suffix_rules)
-        throws ProblemException, ProblemException {
-
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals("-copy")) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a translate rule following -tr.");
-                }
-                String s = args[i+1];
-                checkCopyPattern(s);
-                if (suffix_rules.get(s) != null) {
-                    throw new ProblemException("You have already specified a "+
-                                              "rule for the suffix "+s);
-                }
-                if (s.equals(".class")) {
-                    throw new ProblemException("You cannot have a copy rule for .class files!");
-                }
-                if (s.equals(".java")) {
-                    throw new ProblemException("You cannot have a copy rule for .java files!");
-                }
-                suffix_rules.put(s, javac_state.getCopier());
-            }
-        }
-    }
-
-    /**
-     * Rewrite a / separated path into \ separated, but only
-     * if we are running on a platform were File.separatorChar=='\', ie winapi.
-     */
-    private String fixupSeparator(String p) {
-        if (File.separatorChar == '/') return p;
-        return p.replaceAll("/", "\\\\");
-    }
-
-    /**
-     * Scan the arguments for -i -x -xf -if followed by the option
-     * -src, -sourcepath, -modulepath or -classpath and produce a map of all the
-     * files to referenced for that particular option.
-     *
-     * Store the found sources and the found modules in the supplied maps.
-     */
-    private boolean findFiles(String[] args, String option, Set<String> suffixes,
-                              Map<String,Source> found_files, Map<String, Module> found_modules,
-                              Module current_module, boolean inLinksrc)
-        throws ProblemException, ProblemException
-    {
-        // Track which source roots, source path roots and class path roots have been added.
-        Set<File> roots = new HashSet<>();
-        // Track the current set of package includes,excludes as well as excluded source files,
-        // to be used in the next -src/-sourcepath/-classpath
-        List<String> includes = new LinkedList<>();
-        List<String> excludes = new LinkedList<>();
-        List<String> excludefiles = new LinkedList<>();
-        List<String> includefiles = new LinkedList<>();
-        // This include is used to find all modules in the source.
-        List<String> moduleinfo = new LinkedList<>();
-        moduleinfo.add("module-info.java");
-
-        for (int i = 0; i<args.length; ++i) {
-            if (args[i].equals("-i")) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a package pattern following -i");
-                }
-                String incl = args[i+1];
-                checkPattern(incl);
-                includes.add(incl);
-            }
-            if (args[i].equals("-x")) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a package pattern following -x");
-                }
-                String excl = args[i+1];
-                checkPattern(excl);
-                excludes.add(excl);
-            }
-            if (args[i].equals("-xf")) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a file following -xf");
-                }
-                String exclf = args[i+1];
-                checkFilePattern(exclf);
-                exclf = Util.normalizeDriveLetter(exclf);
-                excludefiles.add(fixupSeparator(exclf));
-            }
-            if (args[i].equals("-if")) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a file following -xf");
-                }
-                String inclf = args[i+1];
-                checkFilePattern(inclf);
-                inclf = Util.normalizeDriveLetter(inclf);
-                includefiles.add(fixupSeparator(inclf));
-            }
-            if (args[i].equals(option)) {
-                if (i+1 >= args.length) {
-                    throw new ProblemException("You have to specify a directory following "+option);
-                }
-                String[] root_dirs = args[i+1].split(File.pathSeparator);
-                for (String r : root_dirs) {
-                    File root = new File(r);
-                    if (!root.isDirectory()) {
-                        throw new ProblemException("\""+r+"\" is not a directory.");
-                    }
-                    try {
-                        root = root.getCanonicalFile();
-                    } catch (IOException e) {
-                        throw new ProblemException(""+e);
-                    }
-                    if (roots.contains(root)) {
-                        throw new ProblemException("\""+r+"\" has already been used for "+option);
-                    }
-                    if (root.equals(bin_dir)) {
-                        throw new ProblemException("\""+r+"\" cannot be used both for "+option+" and -d");
-                    }
-                    if (root.equals(gensrc_dir)) {
-                        throw new ProblemException("\""+r+"\" cannot be used both for "+option+" and -s");
-                    }
-                    if (root.equals(header_dir)) {
-                        throw new ProblemException("\""+r+"\" cannot be used both for "+option+" and -h");
-                    }
-                    roots.add(root);
-                    Source.scanRoot(root, suffixes, excludes, includes, excludefiles, includefiles,
-                                    found_files, found_modules, current_module,
-                                    findBooleanOption(args, "--permit-sources-without-package"),
-                                    false, inLinksrc);
-                }
-            }
-            if (args[i].equals("-src") ||
-                args[i].equals("-sourcepath") ||
-                args[i].equals("-modulepath") ||
-                args[i].equals("-classpath") ||
-                args[i].equals("-cp"))
-            {
-                // Reset the includes,excludes and excludefiles after they have been used.
-                includes = new LinkedList<>();
-                excludes = new LinkedList<>();
-                excludefiles = new LinkedList<>();
-                includefiles = new LinkedList<>();
-            }
-        }
-        return true;
-    }
-
 }
-
--- a/src/share/classes/com/sun/tools/sjavac/Source.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/Source.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -201,7 +201,7 @@
         // It might contain other source files however, (for -tr and -copy) these will
         // always be included, since no package pattern can match the root directory.
         currentModule = addFilesInDir(root, root_prefix, root, suffixes, permitSourcesWithoutPackage,
-                                       excludeFiles, includeFiles, false,
+                                       excludeFiles, includeFiles,
                                        foundFiles, foundModules, currentModule,
                                        inGensrc, inLinksrc);
 
@@ -211,24 +211,28 @@
                 // Descend into the directory structure.
                 scanDirectory(d, root_prefix, root, suffixes,
                               excludes, includes, excludeFiles, includeFiles,
-                              false, foundFiles, foundModules, currentModule, inGensrc, inLinksrc);
+                              foundFiles, foundModules, currentModule, inGensrc, inLinksrc);
             }
         }
     }
 
     /**
      * Test if a path matches any of the patterns given.
-     * The pattern foo.bar matches only foo.bar
-     * The pattern foo.* matches foo.bar and foo.bar.zoo etc
+     * The pattern foo/bar matches only foo/bar
+     * The pattern foo/* matches foo/bar and foo/bar/zoo etc
      */
     static private boolean hasMatch(String path, List<String> patterns) {
+
+        // Convert Windows '\' to '/' for the sake of comparing with the patterns
+        path = path.replace(File.separatorChar, '/');
+
         for (String p : patterns) {
             // Exact match
-            if (p.equals(path)) {
+            if (p.equals(path))
                 return true;
-            }
+
             // Single dot the end matches this package and all its subpackages.
-            if (p.endsWith(".*")) {
+            if (p.endsWith("/*")) {
                 // Remove the wildcard
                 String patprefix = p.substring(0,p.length()-2);
                 // Does the path start with the pattern prefix?
@@ -237,7 +241,7 @@
                     // If the path is longer, then make sure that
                     // the next part of the path starts with a dot (.) to prevent
                     // wildcard matching in the middle of a package name.
-                    if (path.length()==patprefix.length() || path.charAt(patprefix.length())=='.') {
+                    if (path.length()==patprefix.length() || path.charAt(patprefix.length())=='/') {
                         return true;
                     }
                 }
@@ -251,6 +255,9 @@
      // The pattern foo/bar.java only matches foo/bar.java
      // The pattern */bar.java matches foo/bar.java and zoo/bar.java etc
     static private boolean hasFileMatch(String path, List<String> patterns) {
+        // Convert Windows '\' to '/' for the sake of comparing with the patterns
+        path = path.replace(File.separatorChar, '/');
+
         path = Util.normalizeDriveLetter(path);
         for (String p : patterns) {
             // Exact match
@@ -276,7 +283,7 @@
      */
     static private Module addFilesInDir(File dir, int rootPrefix, File root,
                                         Set<String> suffixes, boolean allow_javas,
-                                        List<String> excludeFiles, List<String> includeFiles, boolean all,
+                                        List<String> excludeFiles, List<String> includeFiles,
                                         Map<String,Source> foundFiles,
                                         Map<String,Module> foundModules,
                                         Module currentModule,
@@ -285,79 +292,82 @@
         throws ProblemException
     {
         for (File f : dir.listFiles()) {
-            if (f.isFile()) {
-                boolean should_add =
-                    (excludeFiles == null || excludeFiles.isEmpty() || !hasFileMatch(f.getPath(), excludeFiles))
-                    && (includeFiles == null || includeFiles.isEmpty() || hasFileMatch(f.getPath(), includeFiles));
 
-                if (should_add) {
-                    if (!allow_javas && f.getName().endsWith(".java")) {
-                        throw new ProblemException("No .java files are allowed in the source root "+dir.getPath()+
-                                                   ", please remove "+f.getName());
-                    }
-                    // Extract the file name relative the root.
-                    String fn = f.getPath().substring(rootPrefix);
-                    // Extract the package name.
-                    int sp = fn.lastIndexOf(File.separatorChar);
-                    String pkg = "";
-                    if (sp != -1) {
-                        pkg = fn.substring(0,sp).replace(File.separatorChar,'.');
-                    }
-                    // Is this a module-info.java file?
-                    if (fn.endsWith("module-info.java")) {
-                        // Aha! We have recursed into a module!
-                        if (!currentModule.name().equals("")) {
-                            throw new ProblemException("You have an extra module-info.java inside a module! Please remove "+fn);
+            if (!f.isFile())
+                continue;
+
+            boolean should_add =
+                (excludeFiles == null || excludeFiles.isEmpty() || !hasFileMatch(f.getPath(), excludeFiles))
+                && (includeFiles == null || includeFiles.isEmpty() || hasFileMatch(f.getPath(), includeFiles));
+
+            if (!should_add)
+                continue;
+
+            if (!allow_javas && f.getName().endsWith(".java")) {
+                throw new ProblemException("No .java files are allowed in the source root "+dir.getPath()+
+                                           ", please remove "+f.getName());
+            }
+            // Extract the file name relative the root.
+            String fn = f.getPath().substring(rootPrefix);
+            // Extract the package name.
+            int sp = fn.lastIndexOf(File.separatorChar);
+            String pkg = "";
+            if (sp != -1) {
+                pkg = fn.substring(0,sp);
+            }
+            // Is this a module-info.java file?
+            if (fn.endsWith("module-info.java")) {
+                // Aha! We have recursed into a module!
+                if (!currentModule.name().equals("")) {
+                    throw new ProblemException("You have an extra module-info.java inside a module! Please remove "+fn);
+                }
+                String module_name = fn.substring(0,fn.length()-16);
+                currentModule = new Module(module_name, f.getPath());
+                foundModules.put(module_name, currentModule);
+            }
+            // Extract the suffix.
+            int dp = fn.lastIndexOf(".");
+            String suffix = "";
+            if (dp > 0) {
+                suffix = fn.substring(dp);
+            }
+            // Should the file be added?
+            if (suffixes.contains(suffix)) {
+                Source of = foundFiles.get(f.getPath());
+                if (of != null) {
+                    throw new ProblemException("You have already added the file "+fn+" from "+of.file().getPath());
+                }
+                of = currentModule.lookupSource(f.getPath());
+                if (of != null) {
+                    // Oups, the source is already added, could be ok, could be not, lets check.
+                    if (inLinksrc) {
+                        // So we are collecting sources for linking only.
+                        if (of.isLinkedOnly()) {
+                            // Ouch, this one is also for linking only. Bad.
+                            throw new ProblemException("You have already added the link only file "+fn+" from "+of.file().getPath());
                         }
-                        String module_name = fn.substring(0,fn.length()-16);
-                        currentModule = new Module(module_name, f.getPath());
-                        foundModules.put(module_name, currentModule);
-                    }
-                    // Extract the suffix.
-                    int dp = fn.lastIndexOf(".");
-                    String suffix = "";
-                    if (dp > 0) {
-                        suffix = fn.substring(dp);
-                    }
-                    // Should the file be added?
-                    if (all || suffixes.contains(suffix)) {
-                        Source of = foundFiles.get(f.getPath());
-                        if (of != null) {
-                            throw new ProblemException("You have already added the file "+fn+" from "+of.file().getPath());
-                        }
-                        of = currentModule.lookupSource(f.getPath());
-                        if (of != null) {
-                            // Oups, the source is already added, could be ok, could be not, lets check.
-                            if (inLinksrc) {
-                                // So we are collecting sources for linking only.
-                                if (of.isLinkedOnly()) {
-                                    // Ouch, this one is also for linking only. Bad.
-                                    throw new ProblemException("You have already added the link only file "+fn+" from "+of.file().getPath());
-                                }
-                                // Ok, the existing source is to be compiled. Thus this link only is redundant
-                                // since all compiled are also linked to. Continue to the next source.
-                                // But we need to add the source, so that it will be visible to linking,
-                                // if not the multi core compile will fail because a JavaCompiler cannot
-                                // find the necessary dependencies for its part of the source.
-                                foundFiles.put(f.getPath(), of);
-                                continue;
-                            } else {
-                                // We are looking for sources to compile, if we find an existing to be compiled
-                                // source with the same name, it is an internal error, since we must
-                                // find the sources to be compiled before we find the sources to be linked to.
-                                throw new ProblemException("Internal error: Double add of file "+fn+" from "+of.file().getPath());
-                            }
-                        }
-                        Source s = new Source(currentModule, f.getPath(), f, root);
-                        if (inGensrc) s.markAsGenerated();
-                        if (inLinksrc) {
-                            s.markAsLinkedOnly();
-                        }
-                        pkg = currentModule.name()+":"+pkg;
-                        foundFiles.put(f.getPath(), s);
-                        currentModule.addSource(pkg, s);
+                        // Ok, the existing source is to be compiled. Thus this link only is redundant
+                        // since all compiled are also linked to. Continue to the next source.
+                        // But we need to add the source, so that it will be visible to linking,
+                        // if not the multi core compile will fail because a JavaCompiler cannot
+                        // find the necessary dependencies for its part of the source.
+                        foundFiles.put(f.getPath(), of);
+                        continue;
+                    } else {
+                        // We are looking for sources to compile, if we find an existing to be compiled
+                        // source with the same name, it is an internal error, since we must
+                        // find the sources to be compiled before we find the sources to be linked to.
+                        throw new ProblemException("Internal error: Double add of file "+fn+" from "+of.file().getPath());
                     }
                 }
+                Source s = new Source(currentModule, f.getPath(), f, root);
+                if (inGensrc) s.markAsGenerated();
+                if (inLinksrc) {
+                    s.markAsLinkedOnly();
+                }
+                pkg = currentModule.name()+":"+pkg;
+                foundFiles.put(f.getPath(), s);
+                currentModule.addSource(pkg, s);
             }
         }
         return currentModule;
@@ -368,23 +378,22 @@
     static private void scanDirectory(File dir, int rootPrefix, File root,
                                       Set<String> suffixes,
                                       List<String> excludes, List<String> includes,
-                                      List<String> excludeFiles, List<String> includeFiles, boolean all,
+                                      List<String> excludeFiles, List<String> includeFiles,
                                       Map<String,Source> foundFiles,
                                       Map<String,Module> foundModules,
                                       Module currentModule, boolean inGensrc, boolean inLinksrc)
         throws ProblemException {
 
-        String pkg_name = "";
-        // Remove the root prefix from the dir path, and replace file separator with dots
-        // to get the package name.
+        String path = "";
+        // Remove the root prefix from the dir path
         if (dir.getPath().length() > rootPrefix) {
-            pkg_name = dir.getPath().substring(rootPrefix).replace(File.separatorChar,'.');
+            path = dir.getPath().substring(rootPrefix);
         }
         // Should this package directory be included and not excluded?
-        if (all || ((includes==null || includes.isEmpty() || hasMatch(pkg_name, includes)) &&
-                    (excludes==null || excludes.isEmpty() || !hasMatch(pkg_name, excludes)))) {
+        if ((includes==null || includes.isEmpty() || hasMatch(path, includes)) &&
+            (excludes==null || excludes.isEmpty() || !hasMatch(path, excludes))) {
             // Add the source files.
-            currentModule = addFilesInDir(dir, rootPrefix, root, suffixes, true, excludeFiles, includeFiles, all,
+            currentModule = addFilesInDir(dir, rootPrefix, root, suffixes, true, excludeFiles, includeFiles,
                                           foundFiles, foundModules, currentModule, inGensrc, inLinksrc);
         }
 
@@ -392,7 +401,7 @@
             if (d.isDirectory()) {
                 // Descend into the directory structure.
                 scanDirectory(d, rootPrefix, root, suffixes,
-                              excludes, includes, excludeFiles, includeFiles, all,
+                              excludes, includes, excludeFiles, includeFiles,
                               foundFiles, foundModules, currentModule, inGensrc, inLinksrc);
             }
         }
--- a/src/share/classes/com/sun/tools/sjavac/Transformer.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/Transformer.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,8 @@
 import java.util.Set;
 import java.util.Map;
 
+import com.sun.tools.sjavac.options.Options;
+
 /**
  * The transform interface is used to transform content inside a package, from one form to another.
  * Usually the output form is an unpredictable number of output files. (eg class files)
@@ -95,5 +97,5 @@
                       PrintStream err);
 
     void setExtra(String e);
-    void setExtra(String[] args);
+    void setExtra(Options args);
 }
--- a/src/share/classes/com/sun/tools/sjavac/Util.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/Util.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
 package com.sun.tools.sjavac;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
@@ -94,14 +95,12 @@
      * do settings = cleanOptions("--server:",Util.set("-portfile"),settings);
      *    now settings equals "--server:portfile=bar"
      *
-     * @param optionPrefix The option name, including colon, eg --server:
      * @param allowsSubOptions A set of the allowed sub options, id portfile etc.
      * @param s The option settings string.
      */
-    public static String cleanSubOptions(String optionPrefix, Set<String> allowedSubOptions, String s) {
+    public static String cleanSubOptions(Set<String> allowedSubOptions, String s) {
         StringBuilder sb = new StringBuilder();
-        if (!s.startsWith(optionPrefix)) return "";
-        StringTokenizer st = new StringTokenizer(s.substring(optionPrefix.length()), ",");
+        StringTokenizer st = new StringTokenizer(s, ",");
         while (st.hasMoreTokens()) {
             String o = st.nextToken();
             int p = o.indexOf('=');
@@ -157,4 +156,9 @@
         }
         return null;
     }
+
+    // TODO: Remove when refactoring from java.io.File to java.nio.file.Path.
+    public static File pathToFile(Path path) {
+        return path == null ? null : path.toFile();
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/tools/sjavac/options/ArgumentIterator.java	Thu Apr 24 16:04:44 2014 -0700
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.sjavac.options;
+
+import java.util.Iterator;
+
+public class ArgumentIterator implements Iterator<String> {
+
+    /** The underlying argument iterator */
+    private Iterator<String> iter;
+
+    /** Extra state used to implement peek and current */
+    private String current;
+    private String buffered;
+
+    public ArgumentIterator(Iterable<String> iter) {
+        this.iter = iter.iterator();
+    }
+
+    @Override
+    public boolean hasNext() {
+        return buffered != null || iter.hasNext();
+    }
+
+    @Override
+    public String next() {
+        fillBuffer();
+        current = buffered;
+        buffered = null;
+        return current;
+    }
+
+    /**
+     * @return the last element returned by next() (or {@code null} if next has
+     * never been invoked on this iterator).
+     */
+    public String current() {
+        return current;
+    }
+
+    /** Can't remove current element, since we may have buffered it. */
+    @Override
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @return Returns the next element without advancing the iterator
+     */
+    public String peek() {
+        fillBuffer();
+        return buffered;
+    }
+
+    private void fillBuffer() {
+        if (buffered == null && iter.hasNext())
+            buffered = iter.next();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/tools/sjavac/options/Option.java	Thu Apr 24 16:04:44 2014 -0700
@@ -0,0 +1,360 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.sjavac.options;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.sun.tools.sjavac.CopyFile;
+import com.sun.tools.sjavac.Transformer;
+
+
+/**
+ * Sjavac options can be classified as:
+ *
+ *  (1) relevant only for sjavac, such as --server
+ *  (2) relevant for sjavac and javac, such as -d, or
+ *  (3) relevant only for javac, such as -g.
+ *
+ * This enum represents all options from (1) and (2). Note that instances of
+ * this enum only entail static information about the option. For storage of
+ * option values, refer to com.sun.tools.sjavac.options.Options.
+ */
+public enum Option {
+
+    SRC("-src", "Location of source files to be compiled") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            List<Path> paths = getFileListArg(iter, helper);
+            if (paths != null)
+                helper.sourceRoots(paths);
+        }
+    },
+    SOURCEPATH("-sourcepath", "Specify search path for sources.") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            List<Path> paths = getFileListArg(iter, helper);
+            if (paths != null)
+                helper.sourcepath(paths);
+        }
+    },
+    MODULEPATH("-modulepath", "Specify search path for modules.") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            List<Path> paths = getFileListArg(iter, helper);
+            if (paths != null)
+                helper.modulepath(paths);
+        }
+    },
+    CLASSPATH("-classpath", "Specify search path for classes.") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            List<Path> paths = getFileListArg(iter, helper);
+            if (paths != null)
+                helper.classpath(paths);
+        }
+    },
+    CP("-cp", "An alias for -classpath") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            CLASSPATH.processMatching(iter, helper);
+        }
+    },
+    X("-x", "Exclude directory from the subsequent source directory") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            String pattern = getFilePatternArg(iter, helper);
+            if (pattern != null)
+                helper.exclude(pattern);
+        }
+    },
+    I("-i", "Include only the given directory from the subsequent source directory") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            String pattern = getFilePatternArg(iter, helper);
+            if (pattern != null)
+                helper.include(pattern);
+        }
+    },
+    XF("-xf", "Exclude a given file") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            String pattern = getFilePatternArg(iter, helper);
+            if (pattern != null)
+                helper.excludeFile(pattern);
+        }
+    },
+    IF("-if", "Include only the given file") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            String pattern = getFilePatternArg(iter, helper);
+            if (pattern != null)
+                helper.includeFile(pattern);
+        }
+    },
+    TR("-tr", "Translate resources") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+
+            if (!iter.hasNext()) {
+                helper.reportError(arg + " must be followed by a translation rule");
+                return;
+            }
+
+            String trArg = iter.next();
+
+            // Validate argument syntax. Examples:
+            //   .prop=com.sun.tools.javac.smart.CompileProperties
+            //   .idl=com.sun.corba.CompileIdl
+            //   .g3=antlr.CompileGrammar,debug=true
+            String ident = "[a-zA-Z_][a-zA-Z0-9_]*";
+            Pattern p = Pattern.compile("(?<suffix>\\." + ident + ")=" +
+                                        "(?<class>" + ident + "(\\." + ident + ")*)" +
+                                        "(?<extra>,.*)?");
+            // Check syntax
+            Matcher m = p.matcher(trArg);
+            if (!m.matches()) {
+                helper.reportError("The string \"" + trArg + "\" is not a " +
+                                   "valid translate pattern");
+                return;
+            }
+
+            // Extract relevant parts
+            String suffix = m.group("suffix");
+            String classname = m.group("class");
+            String extra = m.group("extra");
+
+            // Valid suffix?
+            if (suffix.matches("\\.(class|java)")) {
+                helper.reportError("You cannot have a translator for " +
+                                   suffix + " files!");
+                return;
+            }
+
+            // Construct transformer
+            try {
+                Class<?> trCls = Class.forName(classname);
+                Transformer transformer = (Transformer) trCls.newInstance();
+                transformer.setExtra(extra);
+                helper.addTransformer(suffix, transformer);
+            } catch (Exception e) {
+                helper.reportError("Cannot use " + classname +
+                                   " as a translator: " + e.getMessage());
+            }
+        }
+    },
+    COPY("-copy", "Copy resources") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            if (!iter.hasNext()) {
+                helper.reportError(arg + " must be followed by a resource type");
+                return;
+            }
+
+            String copyArg = iter.next();
+
+            // Validate argument syntax. Examples: .gif, .html
+            if (!copyArg.matches("\\.[a-zA-Z_][a-zA-Z0-9_]*")) {
+                helper.reportError("The string \"" + copyArg + "\" is not a " +
+                                   "valid resource type.");
+                return;
+            }
+
+            helper.addTransformer(copyArg, new CopyFile());
+        }
+    },
+    J("-j", "Number of cores") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            if (!iter.hasNext() || !iter.peek().matches("\\d+")) {
+                helper.reportError(arg + " must be followed by an integer");
+                return;
+            }
+            helper.numCores(Integer.parseInt(iter.next()));
+        }
+    },
+    SERVER("--server:", "Specify server configuration file of running server") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            helper.serverConf(iter.current().substring(arg.length()));
+        }
+    },
+    STARTSERVER("--startserver:", "Start server and use the given configuration file") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            helper.startServerConf(iter.current().substring(arg.length()));
+        }
+    },
+    IMPLICIT("-implicit:", "Specify how to treat implicitly referenced source code") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            helper.implicit(iter.current().substring(arg.length()));
+        }
+    },
+    LOG("--log=", "Specify logging level") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            helper.logLevel(iter.current().substring(arg.length()));
+        }
+    },
+    VERBOSE("-verbose", "Set verbosity level to \"info\"") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            helper.logLevel("info");
+        }
+    },
+    PERMIT_UNIDENTIFIED_ARTIFACTS("--permit-unidentified-artifacts", "Keep unidentified artifacts in destination directory") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            helper.permitUnidentifiedArtifacts();
+        }
+    },
+    PERMIT_SOURCES_WITHOUT_PACKAGE("--permit-sources-without-package", "Permit sources in the default package") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            helper.permitDefaultPackage();
+        }
+    },
+    COMPARE_FOUND_SOURCES("--compare-found-sources", "Compare found sources with given sources") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            Path referenceSourceList = getFileArg(iter, helper, true, false);
+            if (referenceSourceList != null)
+                helper.compareFoundSources(referenceSourceList);
+        }
+    },
+    D("-d", "Output destination directory") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            Path dir = getFileArg(iter, helper, false, true);
+            if (dir != null)
+                helper.destDir(dir);
+        }
+    },
+    S("-s", "Directory for generated sources") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            Path dir = getFileArg(iter, helper, false, true);
+            if (dir != null)
+                helper.generatedSourcesDir(dir);
+        }
+    },
+    H("-h", "Directory for header files") {
+        @Override
+        protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
+            Path dir = getFileArg(iter, helper, false, true);
+            if (dir != null)
+                helper.headerDir(dir);
+        }
+    };
+
+    public final String arg;
+
+    final String description;
+
+    private Option(String arg, String description) {
+        this.arg = arg;
+        this.description = description;
+    }
+
+    /** Retrieve and verify syntax of file list argument. */
+    List<Path> getFileListArg(ArgumentIterator iter, OptionHelper helper) {
+        if (!iter.hasNext()) {
+            helper.reportError(arg + " must be followed by a list of files " +
+                              "separated by " + File.pathSeparator);
+            return null;
+        }
+        List<Path> result = new ArrayList<>();
+        for (String pathStr : iter.next().split(File.pathSeparator))
+            result.add(Paths.get(pathStr));
+        return result;
+    }
+
+    /** Retrieve and verify syntax of file argument. */
+    Path getFileArg(ArgumentIterator iter, OptionHelper helper, boolean fileAcceptable, boolean dirAcceptable) {
+
+        if (!iter.hasNext()) {
+            String errmsg = arg + " must be followed by ";
+            if (fileAcceptable && dirAcceptable) errmsg += "a file or directory.";
+            else if (fileAcceptable) errmsg += "a file.";
+            else if (dirAcceptable)  errmsg += "a directory.";
+            else throw new IllegalArgumentException("File or directory must be acceptable.");
+            helper.reportError(errmsg);
+            return null;
+        }
+
+        return Paths.get(iter.next());
+    }
+
+    /** Retrieve the next file or package argument. */
+    String getFilePatternArg(ArgumentIterator iter, OptionHelper helper) {
+
+        if (!iter.hasNext()) {
+            helper.reportError(arg + " must be followed by a file or directory pattern.");
+            return null;
+        }
+
+        return iter.next();
+    }
+
+    // Future cleanup: Change the "=" syntax to ":" syntax to be consistent and
+    // to follow the javac-option style.
+
+    public boolean hasOption() {
+        return arg.endsWith(":") || arg.endsWith("=");
+    }
+
+
+    /**
+     * Process current argument of argIter.
+     *
+     * It's final, since the option customization is typically done in
+     * processMatching.
+     *
+     * @param argIter Iterator to read current and succeeding arguments from.
+     * @param helper The helper to report back to.
+     * @return true iff the argument was processed by this option.
+     */
+    public final boolean processCurrent(ArgumentIterator argIter,
+                                        OptionHelper helper) {
+        String fullArg = argIter.current(); // "-tr" or "-log=level"
+        if (hasOption() ? fullArg.startsWith(arg) : fullArg.equals(arg)) {
+            processMatching(argIter, helper);
+            return true;
+        }
+        // Did not match
+        return false;
+    }
+
+    /** Called by process if the current argument matches this option. */
+    protected abstract void processMatching(ArgumentIterator argIter,
+                                            OptionHelper helper);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/tools/sjavac/options/OptionHelper.java	Thu Apr 24 16:04:44 2014 -0700
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.sjavac.options;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+
+import com.sun.tools.sjavac.Transformer;
+
+/**
+ * This class is used to decode sjavac options.
+ * See com.sun.tools.sjavac.options.Options for example usage.
+ */
+public abstract class OptionHelper {
+
+    /** Handle error */
+    public abstract void reportError(String msg);
+
+    /** Record a package exclusion pattern */
+    public abstract void exclude(String excl);
+
+    /** Record a package inclusion pattern */
+    public abstract void include(String incl);
+
+    /** Record a file exclusion */
+    public abstract void excludeFile(String exclFile);
+
+    /** Record a file inclusion */
+    public abstract void includeFile(String inclFile);
+
+    /** Record a root of sources to be compiled */
+    public abstract void sourceRoots(List<Path> path);
+
+    /** Record a suffix + transformer */
+    public abstract void addTransformer(String suffix, Transformer tr);
+
+    /** Record a sourcepath to be used */
+    public abstract void sourcepath(List<Path> path);
+
+    /** Record a modulepath to be used */
+    public abstract void modulepath(List<Path> path);
+
+    /** Record a classpath to be used */
+    public abstract void classpath(List<Path> path);
+
+    /** Record the number of cores */
+    public abstract void numCores(int parseInt);
+
+    /** Record desired log level */
+    public abstract void logLevel(String level);
+
+    /** Record path for reference source list */
+    public abstract void compareFoundSources(Path referenceList);
+
+    /** Record the fact that unidentified artifacts are permitted */
+    public abstract void permitUnidentifiedArtifacts();
+
+    /** Record the fact that sources in the default package are permitted */
+    public abstract void permitDefaultPackage();
+
+    /** Record server configuration parameters */
+    public abstract void serverConf(String serverConf);
+
+    /** Record server launch configuration parameters */
+    public abstract void startServerConf(String serverConf);
+
+    /** Record some arguments to be passed on to javac */
+    public abstract void javacArg(String... arg);
+
+    /** Sets the destination directory for the compilation */
+    public abstract void destDir(Path dir);
+
+    /** Sets the directory for generated sources */
+    public abstract void generatedSourcesDir(Path genSrcDir);
+
+    /** Sets the directory for generated headers */
+    public abstract void headerDir(Path dir);
+
+    /** Sets the implicit policy */
+    public abstract void implicit(String policy);
+
+
+    /**
+     * Traverses an array of arguments and performs the appropriate callbacks.
+     *
+     * @param args the arguments to traverse.
+     */
+    void traverse(String[] args) {
+
+        ArgumentIterator argIter = new ArgumentIterator(Arrays.asList(args));
+
+        nextArg:
+        while (argIter.hasNext()) {
+
+            String arg = argIter.next();
+
+            if (arg.startsWith("-")) {
+                for (Option opt : Option.values()) {
+                    if (opt.processCurrent(argIter, this))
+                        continue nextArg;
+                }
+
+                javacArg(arg);
+
+                // Does this javac argument take an argument? If so, don't
+                // let it pass on to sjavac as a source root directory.
+                for (com.sun.tools.javac.main.Option javacOpt : com.sun.tools.javac.main.Option.values()) {
+                    if (javacOpt.matches(arg)) {
+                        boolean takesArgument = javacOpt.hasArg();
+                        boolean separateToken = !arg.contains(":") && !arg.contains("=");
+                        if (takesArgument && separateToken)
+                            javacArg(argIter.next());
+                    }
+                }
+            } else {
+                sourceRoots(Arrays.asList(Paths.get(arg)));
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/tools/sjavac/options/Options.java	Thu Apr 24 16:04:44 2014 -0700
@@ -0,0 +1,490 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.sjavac.options;
+
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.sun.tools.sjavac.Transformer;
+
+/**
+ * Instances of this class represent values for sjavac command line options.
+ */
+public class Options {
+
+    // Output directories
+    private Path destDir, genSrcDir, headerDir;
+
+    // Input directories
+    private List<SourceLocation> sources = new ArrayList<>();
+    private List<SourceLocation> sourceSearchPaths = new ArrayList<>();
+    private List<SourceLocation> classSearchPaths = new ArrayList<>();
+    private List<SourceLocation> moduleSearchPaths = new ArrayList<>();
+
+    private String logLevel = "info";
+
+    private boolean permitUnidentifiedArtifact = false;
+    private boolean permitSourcesInDefaultPackage = false;
+
+    private Path sourceReferenceList;
+    private int numCores = 4;
+    private String implicitPolicy = "none";
+    private List<String> javacArgs = new ArrayList<>();
+
+    private Map<String, Transformer> trRules = new HashMap<>();
+
+    private boolean startServer = false;
+
+    // Server configuration string
+    private String serverConf;
+
+    /** Get the policy for implicit classes */
+    public String getImplicitPolicy() {
+        return implicitPolicy;
+    }
+
+    /** Get the path for generated sources (or null if no such path is set) */
+    public Path getGenSrcDir() {
+        return genSrcDir;
+    }
+
+    /** Get the path for the destination directory */
+    public Path getDestDir() {
+        return destDir;
+    }
+
+    /** Get the path for the header directory (or null if no such path is set) */
+    public Path getHeaderDir() {
+        return headerDir;
+    }
+
+    /** Get all source locations for files to be compiled */
+    public List<SourceLocation> getSources() {
+        return sources;
+    }
+
+    /**
+     * Get all paths to search for classes in .java format. (Java-files in
+     * found here should not be compiled.
+     */
+    public List<SourceLocation> getSourceSearchPaths() {
+        return sourceSearchPaths;
+    }
+
+    /** Get all paths to search for classes in. */
+    public List<SourceLocation> getClassSearchPath() {
+        return classSearchPaths;
+    }
+
+    /** Get all paths to search for modules in. */
+    public List<SourceLocation> getModuleSearchPaths() {
+        return moduleSearchPaths;
+    }
+
+    /** Get the log level. */
+    public String getLogLevel() {
+        return logLevel;
+    }
+
+    /** Returns true iff artifacts in the output directories should be kept,
+     * even if they would not be generated in a clean build. */
+    public boolean isUnidentifiedArtifactPermitted() {
+        return permitUnidentifiedArtifact;
+    }
+
+    /** Returns true iff sources in the default package should be permitted. */
+    public boolean isDefaultPackagePermitted() {
+        return permitSourcesInDefaultPackage;
+    }
+
+    /** Get the path to the list of reference sources (or null if none is set) */
+    public Path getSourceReferenceList() {
+        return sourceReferenceList;
+    }
+
+    /** Get the number of cores to be used by sjavac */
+    public int getNumCores() {
+        return numCores;
+    }
+
+    /** Returns all arguments relevant to javac but irrelevant to sjavac. */
+    public List<String> getJavacArgs() {
+        return javacArgs;
+    }
+
+    /**
+     * Get a map which maps suffixes to transformers (for example
+     * ".java" -> CompileJavaPackages)
+     */
+    public Map<String, Transformer> getTranslationRules() {
+        return trRules;
+    }
+
+    /** Return true iff a new server should be started */
+    public boolean startServerFlag() {
+        return startServer;
+    }
+
+    /** Return the server configuration string. */
+    public String getServerConf() {
+        return serverConf;
+    }
+
+    /**
+     * Parses the given argument array and returns a corresponding Options
+     * instance.
+     */
+    public static Options parseArgs(String... args) {
+        Options options = new Options();
+        options.new ArgDecoderOptionHelper().traverse(args);
+        return options;
+    }
+
+    /** Returns true iff a .java file is among the javac arguments */
+    public boolean isJavaFilesAmongJavacArgs() {
+        for (String javacArg : javacArgs)
+            if (javacArg.endsWith(".java"))
+                return true;
+        return false;
+    }
+
+    /** Returns true iff an @-file is among the javac arguments */
+    public boolean isAtFilePresent() {
+        for (String javacArg : javacArgs)
+            if (javacArg.startsWith("@"))
+                return true;
+        return false;
+    }
+
+    /**
+     * Returns a string representation of the options that affect the result of
+     * the compilation. (Used for saving the state of the options used in a
+     * previous compile.)
+     */
+    public String getStateArgsString() {
+
+        // Local utility class for collecting the arguments
+        class StateArgs {
+
+            private List<String> args = new ArrayList<>();
+
+            void addArg(Option opt) {
+                args.add(opt.arg);
+            }
+
+            void addArg(Option opt, Object val) {
+                addArg(opt);
+                args.add(val.toString());
+            }
+
+            void addSourceLocations(Option opt, List<SourceLocation> locs) {
+                for (SourceLocation sl : locs) {
+                    for (String pkg : sl.includes) addArg(Option.I, pkg);
+                    for (String pkg : sl.excludes) addArg(Option.X, pkg);
+                    for (String f : sl.excludedFiles) addArg(Option.XF, f);
+                    for (String f : sl.includedFiles) addArg(Option.IF, f);
+                    addArg(opt, sl.getPath());
+                }
+            }
+
+            String getResult() {
+                String result = "";
+                for (String s : args)
+                    result += s + " ";
+                return result.trim();
+            }
+
+            public void addAll(Collection<String> toAdd) {
+                args.addAll(toAdd);
+            }
+        }
+
+        StateArgs args = new StateArgs();
+
+        // Directories
+        if (genSrcDir != null)
+            args.addArg(Option.S, genSrcDir.normalize());
+
+        if (headerDir != null)
+            args.addArg(Option.H, headerDir.normalize());
+
+        if (destDir != null)
+            args.addArg(Option.D, destDir.normalize());
+
+        // Source roots
+        args.addSourceLocations(Option.SRC, sources);
+        args.addSourceLocations(Option.SOURCEPATH, sourceSearchPaths);
+        args.addSourceLocations(Option.CLASSPATH,  classSearchPaths);
+        args.addSourceLocations(Option.MODULEPATH, moduleSearchPaths);
+
+        // Boolean options
+        if (permitSourcesInDefaultPackage)
+            args.addArg(Option.PERMIT_SOURCES_WITHOUT_PACKAGE);
+
+        if (permitUnidentifiedArtifact)
+            args.addArg(Option.PERMIT_UNIDENTIFIED_ARTIFACTS);
+
+        // Translation rules
+        for (Map.Entry<String, Transformer> tr : trRules.entrySet()) {
+            String val = tr.getKey() + "=" + tr.getValue().getClass().getName();
+            args.addArg(Option.TR, val);
+        }
+
+        // Javac args
+        args.addAll(javacArgs);
+
+        return args.getResult();
+    }
+
+
+    /** Extract the arguments to be passed on to javac. */
+    public String[] prepJavacArgs() {
+        List<String> args = new ArrayList<>();
+
+        // Output directories
+        args.add("-d");
+        args.add(destDir.toString());
+
+        if (getGenSrcDir() != null) {
+            args.add("-s");
+            args.add(genSrcDir.toString());
+        }
+
+        if (headerDir != null) {
+            args.add("-h");
+            args.add(headerDir.toString());
+        }
+
+        // Prep sourcepath
+        List<SourceLocation> sourcepath = new ArrayList<>();
+        sourcepath.addAll(sources);
+        sourcepath.addAll(sourceSearchPaths);
+        if (sourcepath.size() > 0) {
+            args.add("-sourcepath");
+            args.add(concatenateSourceLocations(sourcepath));
+        }
+
+        // Prep classpath
+        if (classSearchPaths.size() > 0) {
+            args.add("-classpath");
+            args.add(concatenateSourceLocations(classSearchPaths));
+        }
+
+        // This can't be anything but 'none'. Enforced by sjavac main method.
+        args.add("-implicit:" + implicitPolicy);
+
+        // Append javac-options (i.e. pass through options not recognized by
+        // sjavac to javac.)
+        args.addAll(javacArgs);
+
+        return args.toArray(new String[args.size()]);
+    }
+
+    // Helper method to join a list of source locations separated by
+    // File.pathSeparator
+    private static String concatenateSourceLocations(List<SourceLocation> locs) {
+        String s = "";
+        for (SourceLocation loc : locs)
+            s += (s.isEmpty() ? "" : java.io.File.pathSeparator) + loc.getPath();
+        return s;
+    }
+
+    // OptionHelper that records the traversed options in this Options instance.
+    private class ArgDecoderOptionHelper extends OptionHelper {
+
+        List<String> includes, excludes, includeFiles, excludeFiles;
+        {
+            resetFilters();
+        }
+
+        boolean headerProvided = false;
+        boolean genSrcProvided = false;
+
+        @Override
+        public void reportError(String msg) {
+            throw new IllegalArgumentException(msg);
+        }
+
+        @Override
+        public void sourceRoots(List<Path> paths) {
+            sources.addAll(createSourceLocations(paths));
+        }
+
+        @Override
+        public void exclude(String exclPattern) {
+            excludes.add(exclPattern);
+        }
+
+        @Override
+        public void include(String inclPattern) {
+            includes.add(inclPattern);
+        }
+
+        @Override
+        public void excludeFile(String exclFilePattern) {
+            excludeFiles.add(exclFilePattern);
+        }
+
+        @Override
+        public void includeFile(String inclFilePattern) {
+            includeFiles.add(inclFilePattern);
+        }
+
+        @Override
+        public void addTransformer(String suffix, Transformer tr) {
+            if (trRules.containsKey(suffix)) {
+                reportError("More than one transformer specified for " +
+                            "suffix " + suffix + ".");
+                return;
+            }
+            trRules.put(suffix, tr);
+        }
+
+        @Override
+        public void sourcepath(List<Path> paths) {
+            sourceSearchPaths.addAll(createSourceLocations(paths));
+        }
+
+        @Override
+        public void modulepath(List<Path> paths) {
+            moduleSearchPaths.addAll(createSourceLocations(paths));
+        }
+
+        @Override
+        public void classpath(List<Path> paths) {
+            classSearchPaths.addAll(createSourceLocations(paths));
+        }
+
+        @Override
+        public void numCores(int n) {
+            numCores = n;
+        }
+
+        @Override
+        public void logLevel(String level) {
+            logLevel = level;
+        }
+
+        @Override
+        public void compareFoundSources(Path referenceList) {
+            sourceReferenceList = referenceList;
+        }
+
+        @Override
+        public void permitUnidentifiedArtifacts() {
+            permitUnidentifiedArtifact = true;
+        }
+
+        @Override
+        public void permitDefaultPackage() {
+            permitSourcesInDefaultPackage = true;
+        }
+
+        @Override
+        public void serverConf(String conf) {
+            if (serverConf != null)
+                reportError("Can not specify more than one server configuration.");
+            else
+                serverConf = conf;
+        }
+
+        @Override
+        public void implicit(String policy) {
+            implicitPolicy = policy;
+        }
+
+        @Override
+        public void startServerConf(String conf) {
+            if (serverConf != null)
+                reportError("Can not specify more than one server configuration.");
+            else {
+                startServer = true;
+                serverConf = conf;
+            }
+        }
+
+        @Override
+        public void javacArg(String... arg) {
+            javacArgs.addAll(Arrays.asList(arg));
+        }
+
+        @Override
+        public void destDir(Path dir) {
+            if (destDir != null) {
+                reportError("Destination directory already specified.");
+                return;
+            }
+            destDir = dir.toAbsolutePath();
+        }
+
+        @Override
+        public void generatedSourcesDir(Path dir) {
+            if (genSrcProvided) {
+                reportError("Directory for generated sources already specified.");
+                return;
+            }
+            genSrcProvided = true;
+            genSrcDir = dir.toAbsolutePath();
+        }
+
+        @Override
+        public void headerDir(Path dir) {
+            if (headerProvided) {
+                reportError("Header directory already specified.");
+                return;
+            }
+            headerProvided = true;
+            headerDir = dir.toAbsolutePath();
+        }
+
+        private List<SourceLocation> createSourceLocations(List<Path> paths) {
+            List<SourceLocation> result = new ArrayList<>();
+            for (Path path : paths) {
+                result.add(new SourceLocation(
+                        path,
+                        includes,
+                        excludes,
+                        includeFiles,
+                        excludeFiles));
+            }
+            resetFilters();
+            return result;
+        }
+
+        private void resetFilters() {
+            includes = new ArrayList<>();
+            excludes = new ArrayList<>();
+            includeFiles = new ArrayList<>();
+            excludeFiles = new ArrayList<>();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/tools/sjavac/options/SourceLocation.java	Thu Apr 24 16:04:44 2014 -0700
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.sjavac.options;
+
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.sun.tools.sjavac.Module;
+import com.sun.tools.sjavac.ProblemException;
+import com.sun.tools.sjavac.Source;
+
+/**
+ * Represents a directory to be used for input to sjavac. (For instance a
+ * sourcepath or classpath.)
+ */
+public class SourceLocation {
+
+    // Path to the root directory
+    private Path path;
+
+    // Package include / exclude patterns and file includes / excludes.
+    List<String> includes, excludes, includedFiles, excludedFiles;
+
+    public SourceLocation(Path path,
+                          List<String> includes,
+                          List<String> excludes,
+                          List<String> includedFiles,
+                          List<String> excludedFiles) {
+        this.path = path;
+        this.includes = includes;
+        this.excludes = excludes;
+        this.includedFiles = includedFiles;
+        this.excludedFiles = excludedFiles;
+    }
+
+
+    /**
+     * Finds all files with the given suffix that pass the include / exclude
+     * filters in this source location.
+     *
+     * @param suffixes The set of suffixes to search for
+     * @param foundFiles The map in which to store the found files
+     * @param foundModules The map in which to store the found modules
+     * @param currentModule The current module
+     * @param permitSourcesInDefaultPackage true if sources in default package
+     *                                      are to be permitted
+     * @param inLinksrc true if in link source
+     */
+    public void findSourceFiles(Set<String> suffixes,
+                                Map<String, Source> foundFiles,
+                                Map<String, Module> foundModules,
+                                Module currentModule,
+                                boolean permitSourcesInDefaultPackage,
+                                boolean inLinksrc) {
+        try {
+            Source.scanRoot(path.toFile(), suffixes, excludes, includes,
+                    excludedFiles, includedFiles, foundFiles, foundModules,
+                    currentModule, permitSourcesInDefaultPackage, false,
+                    inLinksrc);
+        } catch (ProblemException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /** Get the root directory of this source location */
+    public Path getPath() {
+        return path;
+    }
+
+    /** Get the package include patterns */
+    public List<String> getIncludes() {
+        return includes;
+    }
+
+    /** Get the package exclude patterns */
+    public List<String> getExcludes() {
+        return excludes;
+    }
+
+    /** Get the file include patterns */
+    public List<String> getIncludedFiles() {
+        return includedFiles;
+    }
+
+    /** Get the file exclude patterns */
+    public List<String> getExcludedFiles() {
+        return excludedFiles;
+    }
+
+}
--- a/src/share/classes/com/sun/tools/sjavac/server/JavacServer.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/server/JavacServer.java	Thu Apr 24 16:04:44 2014 -0700
@@ -104,6 +104,17 @@
             allPortFiles = new HashMap<>();
         }
         PortFile pf = allPortFiles.get(filename);
+
+        // Port file known. Does it still exist?
+        if (pf != null) {
+            try {
+                if (!pf.exists())
+                    pf = null;
+            } catch (IOException ioex) {
+                ioex.printStackTrace();
+            }
+        }
+
         if (pf == null) {
             pf = new PortFile(filename);
             allPortFiles.put(filename, pf);
@@ -305,7 +316,7 @@
                     // We could not connect to the server. Try again.
                     attempts++;
                     try {
-                        Thread.sleep(WAIT_BETWEEN_CONNECT_ATTEMPTS);
+                        Thread.sleep(WAIT_BETWEEN_CONNECT_ATTEMPTS * 1000);
                     } catch (InterruptedException e) {
                     }
                 }
--- a/src/share/classes/com/sun/tools/sjavac/server/PortFile.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/src/share/classes/com/sun/tools/sjavac/server/PortFile.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
--- a/test/com/sun/javadoc/5093723/T5093723.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/5093723/T5093723.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,10 +33,8 @@
 
 public class T5093723 extends JavadocTester {
 
-    private static final String BUG_ID = "5093723";
-
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID + ".out", "-Xdoclint:none",
+        "-d", OUTPUT_DIR + ".out", "-Xdoclint:none",
         SRC_DIR + "/DocumentedClass.java",
         SRC_DIR + "/UndocumentedClass.java"
     };
@@ -46,12 +44,4 @@
         if (tester.runJavadoc(ARGS) != 0)
           throw new AssertionError("non-zero return code from javadoc");
     }
-
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/AccessSummary/AccessSummary.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/AccessSummary/AccessSummary.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,30 +34,27 @@
 
 public class AccessSummary extends JavadocTester {
 
-    private static final String BUG_ID = "4637604-4775148";
-    private static final String OUTPUT_DIR1 = "docs1-" + BUG_ID + "/";
-
     /**
      * Assign value for [ fileToSearch, stringToFind ]
      */
     private static final String[][] TESTARRAY1 = {
 
         // Test that the summary attribute appears
-        { OUTPUT_DIR1 + "overview-summary.html",
+        { "overview-summary.html",
                  "summary=\"Packages table, listing packages, and an explanation\"" },
 
         // Test that the summary attribute appears
-        { OUTPUT_DIR1 + "p1/C1.html",
+        { "p1/C1.html",
                  "summary=\"Constructor Summary table, listing constructors, and an explanation\"" },
 
         // Test that the summary attribute appears
-        { OUTPUT_DIR1 + "constant-values.html",
+        { "constant-values.html",
                  "summary=\"Constant Field Values table, listing constant fields, and values\"" }
     };
 
     // First test with -header only
     private static final String[] JAVADOC_ARGS = new String[] {
-            "-d", OUTPUT_DIR1,
+            "-d", OUTPUT_DIR,
             "-sourcepath", SRC_DIR,
             "p1", "p2"};
 
@@ -67,21 +64,7 @@
      */
     public static void main(String[] args) {
         JavadocTester tester = new AccessSummary();
-        run(tester, JAVADOC_ARGS,  TESTARRAY1, new String[][] {});
+        tester.run(JAVADOC_ARGS,  TESTARRAY1, new String[][] {});
         tester.printSummary();       // Necessary for string search
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/MetaTag/MetaTag.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/MetaTag/MetaTag.java	Thu Apr 24 16:04:44 2014 -0700
@@ -39,8 +39,6 @@
 public class MetaTag extends JavadocTester {
 
     //Test information.
-    private static final String BUG_ID = "4034096-4764726-6235799";
-    private static final String OUTPUT_DIR = "docs-" + BUG_ID;
     private static final SimpleDateFormat m_dateFormat = new SimpleDateFormat("yyyy-MM-dd");
 
     //Javadoc arguments.
@@ -63,65 +61,62 @@
     //Input for string search tests.
     private static final String[][] TEST = {
 
-        { OUTPUT_DIR + "/p1/C1.html",
+        { "p1/C1.html",
            "<meta name=\"keywords\" content=\"p1.C1 class\">" },
 
-        { OUTPUT_DIR + "/p1/C1.html",
+        { "p1/C1.html",
            "<meta name=\"keywords\" content=\"field1\">" },
 
-        { OUTPUT_DIR + "/p1/C1.html",
+        { "p1/C1.html",
            "<meta name=\"keywords\" content=\"field2\">" },
 
-        { OUTPUT_DIR + "/p1/C1.html",
+        { "p1/C1.html",
            "<meta name=\"keywords\" content=\"method1()\">" },
 
-        { OUTPUT_DIR + "/p1/C1.html",
+        { "p1/C1.html",
            "<meta name=\"keywords\" content=\"method2()\">" },
 
-        { OUTPUT_DIR + "/p1/package-summary.html",
+        { "p1/package-summary.html",
            "<meta name=\"keywords\" content=\"p1 package\">" },
 
-        { OUTPUT_DIR + "/overview-summary.html",
+        { "overview-summary.html",
            "<meta name=\"keywords\" content=\"Overview, Sample Packages\">" },
 
         //NOTE: Hopefully, this regression test is not run at midnight.  If the output
         //was generated yesterday and this test is run today, the test will fail.
-        {OUTPUT_DIR + "/overview-summary.html",
+        { "overview-summary.html",
            "<meta name=\"date\" "
                             + "content=\"" + m_dateFormat.format(new Date()) + "\">"},
     };
 
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
-    private static final String[][] TEST2 = NO_TEST;
     private static final String[][] NEGATED_TEST2 = {
         //No keywords when -keywords is not used.
-        { OUTPUT_DIR + "-2/p1/C1.html",
+        { "p1/C1.html",
            "<META NAME=\"keywords\" CONTENT=\"p1.C1 class\">" },
 
-        { OUTPUT_DIR + "-2/p1/C1.html",
+        { "p1/C1.html",
            "<META NAME=\"keywords\" CONTENT=\"field1\">" },
 
-        { OUTPUT_DIR + "-2/p1/C1.html",
+        { "p1/C1.html",
            "<META NAME=\"keywords\" CONTENT=\"field2\">" },
 
-        { OUTPUT_DIR + "-2/p1/C1.html",
+        { "p1/C1.html",
            "<META NAME=\"keywords\" CONTENT=\"method1()\">" },
 
-        { OUTPUT_DIR + "-2/p1/C1.html",
+        { "p1/C1.html",
            "<META NAME=\"keywords\" CONTENT=\"method2()\">" },
 
-        { OUTPUT_DIR + "-2/p1/package-summary.html",
+        { "p1/package-summary.html",
            "<META NAME=\"keywords\" CONTENT=\"p1 package\">" },
 
-        { OUTPUT_DIR + "-2/overview-summary.html",
+        { "overview-summary.html",
            "<META NAME=\"keywords\" CONTENT=\"Overview Summary, Sample Packages\">" },
 
         //The date metatag should not show up when -notimestamp is used.
 
         //NOTE: Hopefully, this regression test is not run at midnight.  If the output
         //was generated yesterday and this test is run today, the test will fail.
-        {OUTPUT_DIR + "-2/overview-summary.html",
+        { "overview-summary.html",
            "<META NAME=\"date\" "
                             + "CONTENT=\"" + m_dateFormat.format(new Date()) + "\">"},
     };
@@ -132,22 +127,8 @@
      */
     public static void main(String[] args) {
         MetaTag tester = new MetaTag();
-        run(tester, ARGS, TEST, NEGATED_TEST);
-        run(tester, ARGS_NO_TIMESTAMP_NO_KEYWORDS, TEST2, NEGATED_TEST2);
+        tester.run(ARGS, TEST, NO_TEST);
+        tester.run(ARGS_NO_TIMESTAMP_NO_KEYWORDS, NO_TEST, NEGATED_TEST2);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java	Thu Apr 24 16:04:44 2014 -0700
@@ -37,12 +37,9 @@
 public class PackagesHeader extends JavadocTester {
 
     //Test information.
-    private static final String BUG_ID = "4766385";
-    private static final String OUTPUT_DIR = "docs-" + BUG_ID;
-
-    private static final String OUTPUT_DIR1 = "docs1-" + BUG_ID + "/";
-    private static final String OUTPUT_DIR2 = "docs2-" + BUG_ID + "/";
-    private static final String OUTPUT_DIR3 = "docs3-" + BUG_ID + "/";
+    private static final String OUTPUT_DIR1 = OUTPUT_DIR + "-1/";
+    private static final String OUTPUT_DIR2 = OUTPUT_DIR + "-2/";
+    private static final String OUTPUT_DIR3 = OUTPUT_DIR + "-3/";
 
     /**
      * Assign value for [ fileToSearch, stringToFind ]
@@ -50,7 +47,7 @@
     private static final String[][] TESTARRAY1 = {
 
         // Test that the -header shows up in the packages frame
-        { OUTPUT_DIR1 + "overview-frame.html",
+        { "overview-frame.html",
                  "Main Frame Header" }
     };
 
@@ -59,7 +56,7 @@
         // Test that the -packagesheader string shows
         // up in the packages frame
 
-        {  OUTPUT_DIR2 + "overview-frame.html",
+        { "overview-frame.html",
                  "Packages Frame Header" }
     };
 
@@ -67,10 +64,10 @@
 
         // Test that the both headers show up and are different
 
-        { OUTPUT_DIR3 + "overview-frame.html",
+        { "overview-frame.html",
                  "Packages Frame Header" },
 
-        { OUTPUT_DIR3 + "overview-summary.html",
+        { "overview-summary.html",
                  "Main Frame Header" }
     };
 
@@ -97,9 +94,6 @@
             "p1", "p2"};
 
 
-    //Input for string search tests.
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
     /**
      * The entry point of the test.
      * @param args the array of command line arguments.
@@ -107,24 +101,10 @@
     public static void main(String[] args) {
         JavadocTester tester = new PackagesHeader();
 
-        run(tester, JAVADOC_ARGS1, TESTARRAY1, NEGATED_TEST);
-        run(tester, JAVADOC_ARGS2, TESTARRAY2, NEGATED_TEST);
-        run(tester, JAVADOC_ARGS3, TESTARRAY3, NEGATED_TEST);
+        tester.run(JAVADOC_ARGS1, TESTARRAY1, NO_TEST);
+        tester.run(JAVADOC_ARGS2, TESTARRAY2, NO_TEST);
+        tester.run(JAVADOC_ARGS3, TESTARRAY3, NO_TEST);
 
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/T6735320/T6735320.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/T6735320/T6735320.java	Thu Apr 24 16:04:44 2014 -0700
@@ -31,20 +31,11 @@
  */
 public class T6735320 extends JavadocTester {
 
-    private static final String BUG_ID = "6735320";
     private static final String[] ARGS = new String[]{
-        "-d", BUG_ID + ".out",
+        "-d", OUTPUT_DIR + ".out",
         SRC_DIR + "/SerialFieldTest.java"
     };
 
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    public String getBugName() {
-        return getClass().getName();
-    }
-
     public static void main(String... args) {
         T6735320 tester = new T6735320();
         if (tester.runJavadoc(ARGS) == 0) {
--- a/test/com/sun/javadoc/_template/Template.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/_template/Template.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,10 +33,6 @@
 
 public class Template extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "<BUG ID>";
-    private static final String OUTPUT_DIR = "docs-" + BUG_ID;
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
         "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR
@@ -52,21 +48,7 @@
      */
     public static void main(String[] args) {
         Template tester = new Template();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/_template/TemplateComplete.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/_template/TemplateComplete.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,10 +33,6 @@
 
 public class TemplateComplete extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "<BUG ID>";
-    private static final String OUTPUT_DIR = "docs-" + BUG_ID;
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
         "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR
@@ -51,6 +47,8 @@
 
 
     //Input for file diff test.
+    private static final String DIFFDIR1 = null;
+    private static final String DIFFDIR2 = null;
     private static final String[][] FILES_TO_DIFF = {};
 
     /**
@@ -59,23 +57,9 @@
      */
     public static void main(String[] args) {
         TemplateComplete tester = new TemplateComplete();
-        int actualExitCode = run(tester, ARGS, TEST, NEGATED_TEST);
+        int actualExitCode = tester.run(ARGS, TEST, NEGATED_TEST);
         tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode);
-        tester.runDiffs(FILES_TO_DIFF, false);
+        tester.runDiffs(DIFFDIR1, DIFFDIR2, FILES_TO_DIFF, false);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/constantValues/TestConstantValuesDriver.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/constantValues/TestConstantValuesDriver.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,9 +33,8 @@
  */
 public class TestConstantValuesDriver extends JavadocTester {
 
-    private static final String BUG_ID = "4504730-4526070-5077317";
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, SRC_DIR + "/TestConstantValues.java",
+        "-d", OUTPUT_DIR, SRC_DIR + "/TestConstantValues.java",
         SRC_DIR + "/TestConstantValues2.java",
         SRC_DIR + "/A.java"
     };
@@ -47,31 +46,17 @@
     public static void main(String[] args) {
         String[][] tests = new String[5][2];
         for (int i = 0; i < tests.length-1; i++) {
-            tests[i][0] = BUG_ID + "/constant-values.html";
+            tests[i][0] = "constant-values.html";
             tests[i][1] = "TEST"+(i+1)+"PASSES";
         }
-        tests[tests.length-1][0] = BUG_ID + "/constant-values.html";
+        tests[tests.length-1][0] = "constant-values.html";
         tests[tests.length-1][1] = "<code>\"&lt;Hello World&gt;\"</code>";
         TestConstantValuesDriver tester = new TestConstantValuesDriver();
-        run(tester, ARGS, tests, NO_TEST);
+        tester.run(ARGS, tests, NO_TEST);
         tester.printSummary();
     }
 
     /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
-
-    /**
      * @throws java.io.IOException Test 1 passes
      * @throws java.io.IOException Test 2 passes
      * @throws java.lang.NullPointerException comment three
--- a/test/com/sun/javadoc/dupThrowsTags/TestDupThrowsTags.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/dupThrowsTags/TestDupThrowsTags.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,9 +33,8 @@
  */
 public class TestDupThrowsTags extends JavadocTester {
 
-    private static final String BUG_ID = "4525364";
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, SRC_DIR + "/TestDupThrowsTags.java"
+        "-d", OUTPUT_DIR, SRC_DIR + "/TestDupThrowsTags.java"
     };
 
     /**
@@ -45,29 +44,15 @@
     public static void main(String[] args) {
         String[][] tests = new String[4][2];
         for (int i = 0; i < tests.length; i++) {
-            tests[i][0] = BUG_ID + "/TestDupThrowsTags.html";
+            tests[i][0] = "TestDupThrowsTags.html";
             tests[i][1] = "Test "+(i+1)+" passes";
         }
         TestDupThrowsTags tester = new TestDupThrowsTags();
-        run(tester, ARGS, tests, NO_TEST);
+        tester.run(ARGS, tests, NO_TEST);
         tester.printSummary();
     }
 
     /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
-
-    /**
      * @throws java.io.IOException Test 1 passes
      * @throws java.io.IOException Test 2 passes
      * @throws java.lang.NullPointerException Test 3 passes
--- a/test/com/sun/javadoc/lib/JavadocTester.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/lib/JavadocTester.java	Thu Apr 24 16:04:44 2014 -0700
@@ -21,8 +21,6 @@
  * questions.
  */
 
-import com.sun.javadoc.*;
-import java.util.*;
 import java.io.*;
 
 
@@ -56,6 +54,7 @@
 
     protected static final String SRC_DIR = System.getProperty("test.src", ".");
     protected static final String JAVA_VERSION = System.getProperty("java.version");
+    protected static final String OUTPUT_DIR = "out";
     protected static final String[][] NO_TEST = new String[][] {};
     protected static final String[] NO_FILE_TEST = new String[] {};
 
@@ -105,11 +104,16 @@
     public StringWriter warnings;
 
     /**
-     * The buffer of warning output..
+     * The buffer of warning output.
      */
     public StringBuffer standardOut;
 
     /**
+     * The output directory.
+     */
+    private File outputDir;
+
+    /**
      * The current subtest number.
      */
     private static int numTestsRun = 0;
@@ -131,37 +135,23 @@
     }
 
     /**
-     * Return the bug id.
-     * @return the bug id
-     */
-    public abstract String getBugId();
-
-    /**
-     * Return the name of the bug.
-     * @return the name of the bug
-     */
-    public abstract String getBugName();
-
-    /**
      * Execute the tests.
      *
-     * @param tester           the tester to execute
      * @param args             the arguments to pass to Javadoc
      * @param testArray        the array of tests
      * @param negatedTestArray the array of negated tests
      * @return                 the return code for the execution of Javadoc
      */
-    public static int run(JavadocTester tester, String[] args,
+    public int run(String[] args,
             String[][] testArray, String[][] negatedTestArray) {
-        int returnCode = tester.runJavadoc(args);
-        tester.runTestsOnHTML(testArray, negatedTestArray);
+        int returnCode = runJavadoc(args);
+        runTestsOnHTML(testArray, negatedTestArray);
         return returnCode;
     }
 
     /**
      * Execute the tests.
      *
-     * @param tester               the tester to execute
      * @param args                 the arguments to pass to Javadoc
      * @param testArray            the array of tests
      * @param negatedTestArray     the array of negated tests
@@ -169,12 +159,12 @@
      * @param negatedFileTestArray the array of negated file tests
      * @return                     the return code for the execution of Javadoc
      */
-    public static int run(JavadocTester tester, String[] args,
-            String[][] testArray, String[][] negatedTestArray, String[] fileTestArray,
-            String[] negatedFileTestArray) {
-        int returnCode = tester.runJavadoc(args);
-        tester.runTestsOnHTML(testArray, negatedTestArray);
-        tester.runTestsOnFile(fileTestArray, negatedFileTestArray);
+    public int run(String[] args,
+            String[][] testArray, String[][] negatedTestArray,
+            String[] fileTestArray, String[] negatedFileTestArray) {
+        int returnCode = runJavadoc(args);
+        runTestsOnHTML(testArray, negatedTestArray);
+        runTestsOnFile(fileTestArray, negatedFileTestArray);
         return returnCode;
     }
 
@@ -208,6 +198,13 @@
                                     + javadocRunNum + ")...");
         }
         initOutputBuffers();
+        outputDir = new File(".");
+        for (int i = 0; i < args.length - 2; i++) {
+            if (args[i].equals("-d")) {
+                outputDir = new File(args[++i]);
+                break;
+            }
+        }
 
         ByteArrayOutputStream stdout = new ByteArrayOutputStream();
         PrintStream prevOut = System.out;
@@ -218,7 +215,7 @@
         System.setErr(new PrintStream(stderr));
 
         int returnCode = com.sun.tools.javadoc.Main.execute(
-                getBugName(),
+                "javadoc",
                 new PrintWriter(errors, true),
                 new PrintWriter(warnings, true),
                 new PrintWriter(notices, true),
@@ -260,60 +257,53 @@
      * Run array of tests on the generated files.
      * This method accepts a fileTestArray for testing if a file is generated
      * and a negatedFileTestArray for testing if a file is not found.
+     * The files are relative to the most recent output directory specified
+     * with -d.
      *
-     * @param testArray         the array of file tests
-     * @param negatedTestArray  the array of negated file tests
+     * @param fileTestArray         the array of file tests
+     * @param negatedFileTestArray  the array of negated file tests
      */
     public void runTestsOnFile(String[] fileTestArray, String[] negatedFileTestArray) {
-        runTestsOnFile(fileTestArray, false);
-        runTestsOnFile(negatedFileTestArray, true);
+        runTestsOnFile(outputDir, fileTestArray, false);
+        runTestsOnFile(outputDir, negatedFileTestArray, true);
     }
 
     /**
      * Run the array of tests on the resulting HTML.
+     * The files are relative to the most recent output directory specified
+     * with -d.
      *
      * @param testArray the array of tests
      * @param isNegated true if test is negated; false otherwise
      */
     private void runTestsOnHTML(String[][] testArray , boolean isNegated) {
-        for (int i = 0; i < testArray.length; i++) {
-
+        for (String[] test : testArray) {
             numTestsRun++;
-
             System.out.print("Running subtest #" + numTestsRun + "... ");
-
             // Get string to find
-            String stringToFind = testArray[i][1];
-
+            String stringToFind = test[1];
             // Read contents of file into a string
             String fileString;
             try {
-                fileString = readFileToString(testArray[i][0]);
+                fileString = readFileToString(outputDir, test[0]);
             } catch (Error e) {
                 if (isNegated) {
-                  System.out.println( "FAILED" + "\n"
-                                    + "for bug " + getBugId()
-                                    + " (" + getBugName() + ") "
-                                    + "due to "
-                                    + e + "\n");
-                  continue;
+                    System.out.println( "FAILED, due to " + e + "\n");
+                    continue;
                 }
                 throw e;
             }
             // Find string in file's contents
             boolean isFound = findString(fileString, stringToFind);
-            if ((isNegated && !isFound) || (!isNegated && isFound) ) {
+            if ((isNegated && !isFound) || (!isNegated && isFound)) {
                 numTestsPassed += 1;
-                System.out.println( "Passed" + "\n"
-                                    + (isNegated ? "not found:" : "found:") + "\n"
-                                    + stringToFind + " in " + testArray[i][0] + "\n");
+                System.out.println("Passed" + "\n"
+                        + (isNegated ? "not found:" : "found:") + "\n"
+                        + stringToFind + " in " + test[0] + "\n");
             } else {
-                System.out.println( "FAILED" + "\n"
-                                    + "for bug " + getBugId()
-                                    + " (" + getBugName() + ")" + "\n"
-                                    + "when searching for:" + "\n"
-                                    + stringToFind
-                                    + " in " + testArray[i][0] + "\n");
+                System.out.println("FAILED, when searching for:" + "\n"
+                        + stringToFind
+                        + " in " + test[0] + "\n");
             }
         }
     }
@@ -324,21 +314,15 @@
      * @param testArray the array of file tests
      * @param isNegated true if test is negated; false otherwise
      */
-    private void runTestsOnFile(String[] testArray, boolean isNegated) {
-        String fileName;
-        String failedString;
-        String passedString;
-        for (int i = 0; i < testArray.length; i++) {
+    private void runTestsOnFile(File baseDir, String[] testArray, boolean isNegated) {
+        for (String fileName : testArray) {
             numTestsRun++;
-            fileName = testArray[i];
-            failedString = "FAILED" + "\n"
-                    + "for bug " + getBugId() + " (" + getBugName() + ") "
-                    + "file (" + fileName + ") found" + "\n";
-            passedString = "Passed" + "\n" +
-                        "file (" + fileName + ") not found" + "\n";
+            String failedString = "FAILED: file (" + fileName + ") found" + "\n";
+            String passedString = "Passed" + "\n" +
+                    "file (" + fileName + ") not found" + "\n";
             System.out.print("Running subtest #" + numTestsRun + "... ");
             try {
-                File file = new File(fileName);
+                File file = new File(baseDir, fileName);
                 if ((file.exists() && !isNegated) || (!file.exists() && isNegated)) {
                     numTestsPassed += 1;
                     System.out.println(passedString);
@@ -354,27 +338,33 @@
     /**
      * Iterate through the list of given file pairs and diff each file.
      *
-     * @param filePairs the pairs of files to diff.
-     * @throws an Error is thrown if any differences are found between
+     * @param baseDir1 the directory containing the first set of files
+     * @param baseDir2 the directory containing the second set of files
+     * @param files the set of files to be compared
+     * @throws Error if any differences are found between
      * file pairs.
      */
-    public void runDiffs(String[][] filePairs) throws Error {
-        runDiffs(filePairs, true);
+    public void runDiffs(String baseDir1, String baseDir2, String[] files) throws Error {
+        runDiffs(baseDir1, baseDir2, files, true);
     }
 
     /**
      * Iterate through the list of given file pairs and diff each file.
      *
-     * @param filePairs the pairs of files to diff.
-     * @param throwErrorIFNoMatch flag to indicate whether or not to throw
+     * @param baseDir1 the directory containing the first set of files
+     * @param baseDir2 the directory containing the second set of files
+     * @param files the set of files to be compared
+     * @param throwErrorIfNoMatch flag to indicate whether or not to throw
      * an error if the files do not match.
      *
-     * @throws an Error is thrown if any differences are found between
-     * file pairs and throwErrorIFNoMatch is true.
+     * @throws Error if any differences are found between
+     * file pairs and throwErrorIfNoMatch is true.
      */
-    public void runDiffs(String[][] filePairs, boolean throwErrorIfNoMatch) throws Error {
-        for (int i = 0; i < filePairs.length; i++) {
-            diff(filePairs[i][0], filePairs[i][1], throwErrorIfNoMatch);
+    public void runDiffs(String baseDir1, String baseDir2, String[] files, boolean throwErrorIfNoMatch) throws Error {
+        File bd1 = new File(baseDir1);
+        File bd2 = new File(baseDir2);
+        for (String file : files) {
+            diff(bd1, bd2, file, throwErrorIfNoMatch);
         }
     }
 
@@ -394,8 +384,7 @@
                 actualExitCode);
             numTestsPassed++;
         } else {
-            System.out.println( "FAILED" + "\n" + "for bug " + getBugId()
-                + " (" + getBugName() + ")" + "\n" + "Expected return code " +
+            System.out.println( "FAILED: expected return code " +
                 expectedExitCode + " but got " + actualExitCode);
         }
     }
@@ -412,8 +401,7 @@
             // Test failed
             throw new Error("\n" + (numTestsRun - numTestsPassed)
                                     + " of " + (numTestsRun)
-                                    + " subtests failed for bug " + getBugId()
-                                    + " (" + getBugName() + ")" + "\n");
+                                    + " subtests failed\n");
         }
     }
 
@@ -434,28 +422,39 @@
      * @return          the file in string format
      */
     public String readFileToString(String fileName) throws Error {
-        if (fileName.equals(ERROR_OUTPUT)) {
-            return getErrorOutput();
-        } else if (fileName.equals(NOTICE_OUTPUT)) {
-            return getNoticeOutput();
-        } else if (fileName.equals(WARNING_OUTPUT)) {
-            return getWarningOutput();
-        } else if (fileName.equals(STANDARD_OUTPUT)) {
-            return getStandardOutput();
+        return readFileToString(outputDir, fileName);
+    }
+
+    /**
+     * Read the file and return it as a string.
+     *
+     * @param baseDir   the directory in which to locate the file
+     * @param fileName  the name of the file to read
+     * @return          the file in string format
+     */
+    private String readFileToString(File baseDir, String fileName) throws Error {
+        switch (fileName) {
+            case ERROR_OUTPUT:
+                return getErrorOutput();
+            case NOTICE_OUTPUT:
+                return getNoticeOutput();
+            case WARNING_OUTPUT:
+                return getWarningOutput();
+            case STANDARD_OUTPUT:
+                return getStandardOutput();
         }
         try {
-            File file = new File(fileName);
+            File file = new File(baseDir, fileName);
             if ( !file.exists() ) {
                 System.out.println("\n" + "FILE DOES NOT EXIST: " + fileName);
             }
-            BufferedReader in = new BufferedReader(new FileReader(file));
-
-            // Create an array of characters the size of the file
-            char[] allChars = new char[(int)file.length()];
-
-            // Read the characters into the allChars array
-            in.read(allChars, 0, (int)file.length());
-            in.close();
+            char[] allChars;
+            try (BufferedReader in = new BufferedReader(new FileReader(file))) {
+                // Create an array of characters the size of the file
+                allChars = new char[(int)file.length()];
+                // Read the characters into the allChars array
+                in.read(allChars, 0, (int)file.length());
+            }
 
             // Convert to a string
             String allCharsString = new String(allChars);
@@ -472,22 +471,24 @@
     /**
      * Compare the two given files.
      *
-     * @param file1 the first file to compare.
-     * @param file2 the second file to compare.
+     * @param baseDir1 the directory in which to locate the first file
+     * @param baseDir2 the directory in which to locate the second file
+     * @param file the file to compare in the two base directories
      * @param throwErrorIFNoMatch flag to indicate whether or not to throw
      * an error if the files do not match.
      * @return true if the files are the same and false otherwise.
      */
-    public boolean diff(String file1, String file2, boolean throwErrorIFNoMatch) throws Error {
-        String file1Contents = readFileToString(file1);
-        String file2Contents = readFileToString(file2);
+    private boolean diff(File baseDir1, File baseDir2, String file,
+            boolean throwErrorIFNoMatch) throws Error {
+        String file1Contents = readFileToString(baseDir1, file);
+        String file2Contents = readFileToString(baseDir2, file);
         numTestsRun++;
         if (file1Contents.trim().compareTo(file2Contents.trim()) == 0) {
-            System.out.println("Diff successful: " + file1 + ", " + file2);
+            System.out.println("Diff successful: " + new File(baseDir1, file) + ", " + new File(baseDir2, file));
             numTestsPassed++;
             return true;
         } else if (throwErrorIFNoMatch) {
-            throw new Error("Diff failed: " + file1 + ", " + file2);
+            throw new Error("Diff failed: " + new File(baseDir1, file) + ", " + new File(baseDir2, file));
         } else {
             return false;
         }
@@ -561,12 +562,12 @@
                 destDirObj.mkdir();
             }
             String[] files = targetDirObj.list();
-            for (int i = 0; i < files.length; i++) {
-                File srcFile = new File(targetDirObj, files[i]);
-                File destFile = new File(destDirObj, files[i]);
+            for (String file : files) {
+                File srcFile = new File(targetDirObj, file);
+                File destFile = new File(destDirObj, file);
                 if (srcFile.isFile()) {
                     System.out.println("Copying " + srcFile + " to " + destFile);
-                        copyFile(destFile, srcFile);
+                    copyFile(destFile, srcFile);
                 } else if(srcFile.isDirectory()) {
                     copyDir(srcFile.getAbsolutePath(), destDirObj.getAbsolutePath());
                 }
@@ -579,13 +580,15 @@
     /**
      * Copy source file to destination file.
      *
+     * @param destfile the destination file
+     * @param srcfile the source file
      * @throws SecurityException
      * @throws IOException
      */
     public static void copyFile(File destfile, File srcfile)
         throws IOException {
         byte[] bytearr = new byte[512];
-        int len = 0;
+        int len;
         FileInputStream input = new FileInputStream(srcfile);
         File destDir = destfile.getParentFile();
         destDir.mkdirs();
@@ -594,8 +597,7 @@
             while ((len = input.read(bytearr)) != -1) {
                 output.write(bytearr, 0, len);
             }
-        } catch (FileNotFoundException exc) {
-        } catch (SecurityException exc) {
+        } catch (FileNotFoundException | SecurityException exc) {
         } finally {
             input.close();
             output.close();
--- a/test/com/sun/javadoc/testAbsLinkPath/TestAbsLinkPath.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testAbsLinkPath/TestAbsLinkPath.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,10 +34,8 @@
 
 public class TestAbsLinkPath extends JavadocTester {
 
-    private static final String BUG_ID = "4640745";
     private static final String[][] TEST = {
-        {"tmp/pkg1/C1.html", "C2.html"}};
-    private static final String[][] NEGATED_TEST = NO_TEST;
+        { "pkg1/C1.html", "C2.html"}};
 
     private static final String[] ARGS1 =
         new String[] {
@@ -53,22 +51,8 @@
      */
     public static void main(String[] args) {
         TestAbsLinkPath tester = new TestAbsLinkPath();
-        run(tester, ARGS1, NO_TEST, NO_TEST);
-        run(tester, ARGS2,  TEST, NEGATED_TEST);
+        tester.run(ARGS1, NO_TEST, NO_TEST);
+        tester.run(ARGS2,  TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testAbstractMethod/TestAbstractMethod.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testAbstractMethod/TestAbstractMethod.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,18 +35,17 @@
 public class TestAbstractMethod extends JavadocTester {
 
     //Test information.
-    private static final String BUG_ID = "8004891";
 
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/A.html",
+        { "pkg/A.html",
             "<td class=\"colFirst\"><code>default void</code></td>"},
-        {BUG_ID + "/pkg/A.html",
+        { "pkg/A.html",
             "<caption><span id=\"t0\" class=\"activeTableTab\"><span>" +
             "All Methods</span><span class=\"tabEnd\">&nbsp;</span></span>" +
             "<span id=\"t2\" class=\"tableTab\"><span>" +
@@ -57,7 +56,7 @@
             "</span><span id=\"t5\" class=\"tableTab\"><span>" +
             "<a href=\"javascript:show(16);\">Default Methods</a></span>" +
             "<span class=\"tabEnd\">&nbsp;</span></span></caption>"},
-        {BUG_ID + "/pkg/B.html",
+        { "pkg/B.html",
             "<caption><span id=\"t0\" class=\"activeTableTab\"><span>" +
             "All Methods</span><span class=\"tabEnd\">&nbsp;</span></span>" +
             "<span id=\"t2\" class=\"tableTab\"><span>" +
@@ -68,9 +67,9 @@
             "<span id=\"t4\" class=\"tableTab\"><span>" +
             "<a href=\"javascript:show(8);\">Concrete Methods</a></span>" +
             "<span class=\"tabEnd\">&nbsp;</span></span></caption>"},
-        {BUG_ID + "/pkg/B.html",
+        { "pkg/B.html",
             "<td class=\"colFirst\"><code>abstract void</code></td>"},
-        {BUG_ID + "/pkg/C.html",
+        { "pkg/C.html",
             "<caption><span id=\"t0\" class=\"activeTableTab\"><span>" +
             "All Methods</span><span class=\"tabEnd\">&nbsp;</span></span>" +
             "<span id=\"t2\" class=\"tableTab\"><span>" +
@@ -79,18 +78,18 @@
             "<span id=\"t5\" class=\"tableTab\"><span>" +
             "<a href=\"javascript:show(16);\">Default Methods</a></span>" +
             "<span class=\"tabEnd\">&nbsp;</span></span></caption>"},
-        {BUG_ID + "/pkg/C.html",
+        { "pkg/C.html",
             "<td class=\"colFirst\"><code>default void</code></td>"}
     };
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/pkg/A.html",
+        { "pkg/A.html",
             "<td class=\"colFirst\"><code>abstract void</code></td>"},
-        {BUG_ID + "/pkg/B.html",
+        { "pkg/B.html",
             "<span><a href=\"javascript:show(16);\">Default Methods</a></span>" +
             "<span class=\"tabEnd\">&nbsp;</span>"},
-        {BUG_ID + "/pkg/B.html",
+        { "pkg/B.html",
             "<td class=\"colFirst\"><code>default void</code></td>"},
-        {BUG_ID + "/pkg/C.html",
+        { "pkg/C.html",
             "<span><a href=\"javascript:show(4);\">Abstract Methods</a></span>" +
             "<span class=\"tabEnd\">&nbsp;</span>"}
     };
@@ -101,21 +100,7 @@
      */
     public static void main(String[] args) {
         TestAbstractMethod tester = new TestAbstractMethod();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testAnchorNames/TestAnchorNames.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testAnchorNames/TestAnchorNames.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,41 +33,40 @@
 
 public class TestAnchorNames extends JavadocTester {
 
-    private static final String BUG_ID = "8025633";
 
     //Input for string search tests.
     private static final String[][] TEST = {
 
         //Test some section markers and links to these markers
 
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"skip.navbar.top\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"#skip.navbar.top\" title=\"Skip navigation links\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"nested.class.summary\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"#nested.class.summary\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"method.summary\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"#method.summary\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"field.detail\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"#field.detail\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"constructor.detail\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"#constructor.detail\">"
         },
 
@@ -75,170 +74,170 @@
 
         //The marker for this appears in the serialized-form.html which we will
         //test below
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../serialized-form.html#pkg1.RegClass\">"
         },
         //Test some fields
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"Z:Z_\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#Z:Z_\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"Z:Z_:D\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#Z:Z_:D\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"Z:Z:D_\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#Z:Z:D_\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"Z:Z:Dfield\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#Z:Z:Dfield\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"fieldInCla:D:D\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#fieldInCla:D:D\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"S_:D:D:D:D:DINT\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#S_:D:D:D:D:DINT\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"method:D:D\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#method:D:D\">"
         },
-        {BUG_ID + "/pkg1/DeprMemClass.html",
+        { "pkg1/DeprMemClass.html",
             "<a name=\"Z:Z_field_In_Class\">"
         },
-        {BUG_ID + "/pkg1/DeprMemClass.html",
+        { "pkg1/DeprMemClass.html",
             "<a href=\"../pkg1/DeprMemClass.html#Z:Z_field_In_Class\">"
         },
         //Test constructor
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"RegClass-java.lang.String-int-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#RegClass-java.lang.String-int-\">"
         },
         //Test some methods
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"Z:Z_methodInClass-java.lang.String-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#Z:Z_methodInClass-java.lang.String-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"method--\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#method--\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"foo-java.util.Map-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#foo-java.util.Map-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"methodInCla:Ds-java.lang.String:A-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#methodInCla:Ds-java.lang.String:A-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"Z:Z_methodInClas:D-java.lang.String-int-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#Z:Z_methodInClas:D-java.lang.String-int-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"methodD-pkg1.RegClass.:DA-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#methodD-pkg1.RegClass.:DA-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a name=\"methodD-pkg1.RegClass.D:A-\">"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             "<a href=\"../pkg1/RegClass.html#methodD-pkg1.RegClass.D:A-\">"
         },
-        {BUG_ID + "/pkg1/DeprMemClass.html",
+        { "pkg1/DeprMemClass.html",
             "<a name=\"Z:Z:Dmethod_In_Class--\">"
         },
-        {BUG_ID + "/pkg1/DeprMemClass.html",
+        { "pkg1/DeprMemClass.html",
             "<a href=\"../pkg1/DeprMemClass.html#Z:Z:Dmethod_In_Class--\">"
         },
 
         //Test enum
 
-        {BUG_ID + "/pkg1/RegClass.Te$t_Enum.html",
+        { "pkg1/RegClass.Te$t_Enum.html",
             "<a name=\"Z:Z:DFLD2\">"
         },
-        {BUG_ID + "/pkg1/RegClass.Te$t_Enum.html",
+        { "pkg1/RegClass.Te$t_Enum.html",
             "<a href=\"../pkg1/RegClass.Te$t_Enum.html#Z:Z:DFLD2\">"
         },
 
         //Test nested class
 
-        {BUG_ID + "/pkg1/RegClass._NestedClas$.html",
+        { "pkg1/RegClass._NestedClas$.html",
             "<a name=\"Z:Z_NestedClas:D--\">"
         },
-        {BUG_ID + "/pkg1/RegClass._NestedClas$.html",
+        { "pkg1/RegClass._NestedClas$.html",
             "<a href=\"../pkg1/RegClass._NestedClas$.html#Z:Z_NestedClas:D--\">"
         },
 
         //Test class use page
 
-        {BUG_ID + "/pkg1/class-use/DeprMemClass.html",
+        { "pkg1/class-use/DeprMemClass.html",
             "<a href=\"../../pkg1/RegClass.html#d____mc\">"
         },
 
         //Test deprecated list page
 
-        {BUG_ID + "/deprecated-list.html",
+        { "deprecated-list.html",
             "<a href=\"pkg1/DeprMemClass.html#Z:Z_field_In_Class\">"
         },
-        {BUG_ID + "/deprecated-list.html",
+        { "deprecated-list.html",
             "<a href=\"pkg1/DeprMemClass.html#Z:Z:Dmethod_In_Class--\">"
         },
 
         //Test constant values page
 
-        {BUG_ID + "/constant-values.html",
+        { "constant-values.html",
             "<a href=\"pkg1/RegClass.html#S_:D:D:D:D:DINT\">"
         },
 
         //Test serialized form page
 
         //This is the marker for the link that appears in the pkg1.RegClass.html page
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
             "<a name=\"pkg1.RegClass\">"
         },
 
         //Test member name index page
 
-        {BUG_ID + "/index-all.html",
+        { "index-all.html",
             "<a name=\"I:Z:Z:D\">"
         },
-        {BUG_ID + "/index-all.html",
+        { "index-all.html",
             "<a href=\"#I:Z:Z:D\">$"
         },
-        {BUG_ID + "/index-all.html",
+        { "index-all.html",
             "<a href=\"#I:Z:Z_\">_"
         }
     };
@@ -246,22 +245,22 @@
     private static final String[][] NEGATED_TEST = {
         //The marker name conversion should only affect HTML anchors. It should not
         //affect the lables.
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             " Z:Z_"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             " Z:Z:Dfield"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             " Z:Z_field_In_Class"
         },
-        {BUG_ID + "/pkg1/RegClass.html",
+        { "pkg1/RegClass.html",
             " S_:D:D:D:D:DINT"
         },
     };
 
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "-use", "pkg1"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1"
     };
 
     /**
@@ -270,21 +269,7 @@
      */
     public static void main(String[] args) throws Exception {
         TestAnchorNames tester = new TestAnchorNames();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testAnnotationOptional/TestAnnotationOptional.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testAnnotationOptional/TestAnnotationOptional.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,44 +35,24 @@
 
 public class TestAnnotationOptional extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "NO_BUG_ID_YET";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/AnnotationOptional.html",
+        { "pkg/AnnotationOptional.html",
             "<a name=\"annotation.type.element.detail\">"
         }
     };
-
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
     /**
      * The entry point of the test.
      * @param args the array of command line arguments.
      */
     public static void main(String[] args) {
         TestAnnotationOptional tester = new TestAnnotationOptional();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testAnnotationTypes/TestAnnotationTypes.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testAnnotationTypes/TestAnnotationTypes.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,47 +34,44 @@
 
 public class TestAnnotationTypes extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4973609-8015249";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/AnnotationTypeField.html",
+        { "pkg/AnnotationTypeField.html",
             "<li>Summary:&nbsp;</li>\n" +
             "<li><a href=\"#annotation.type." +
             "field.summary\">Field</a>&nbsp;|&nbsp;</li>"},
-        {BUG_ID + "/pkg/AnnotationTypeField.html",
+        { "pkg/AnnotationTypeField.html",
             "<li>Detail:&nbsp;</li>\n" +
             "<li><a href=\"#annotation.type." +
             "field.detail\">Field</a>&nbsp;|&nbsp;</li>"},
-        {BUG_ID + "/pkg/AnnotationTypeField.html",
+        { "pkg/AnnotationTypeField.html",
             "<!-- =========== ANNOTATION TYPE FIELD SUMMARY =========== -->"},
-        {BUG_ID + "/pkg/AnnotationTypeField.html",
+        { "pkg/AnnotationTypeField.html",
             "<h3>Field Summary</h3>"},
-        {BUG_ID + "/pkg/AnnotationTypeField.html",
+        { "pkg/AnnotationTypeField.html",
             "<td class=\"colLast\"><code><span class=\"memberNameLink\"><a href=\"../" +
             "pkg/AnnotationTypeField.html#DEFAULT_NAME\">DEFAULT_NAME</a></span>" +
             "</code>&nbsp;</td>"},
-        {BUG_ID + "/pkg/AnnotationTypeField.html",
+        { "pkg/AnnotationTypeField.html",
             "<!-- ============ ANNOTATION TYPE FIELD DETAIL =========== -->"},
-        {BUG_ID + "/pkg/AnnotationTypeField.html",
+        { "pkg/AnnotationTypeField.html",
             "<h4>DEFAULT_NAME</h4>\n" +
             "<pre>public static final&nbsp;java." +
             "lang.String&nbsp;DEFAULT_NAME</pre>"},
-        {BUG_ID + "/pkg/AnnotationType.html",
+        { "pkg/AnnotationType.html",
             "<li>Summary:&nbsp;</li>\n" +
             "<li>Field&nbsp;|&nbsp;</li>"},
-        {BUG_ID + "/pkg/AnnotationType.html",
+        { "pkg/AnnotationType.html",
             "<li>Detail:&nbsp;</li>\n" +
             "<li>Field&nbsp;|&nbsp;</li>"},
     };
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/pkg/AnnotationType.html",
+        { "pkg/AnnotationType.html",
             "<HR>\n\n" +
             "<P>\n\n" +
             "<P>" +
@@ -87,21 +84,7 @@
      */
     public static void main(String[] args) {
         TestAnnotationTypes tester = new TestAnnotationTypes();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,13 +35,11 @@
 
 public class TestBackSlashInLink extends JavadocTester {
 
-    private static final String BUG_ID = "4511110";
     private static final String[][] TEST = {
-        {BUG_ID + "/C.html", "src-html/C.html#line.7"}};
-    private static final String[][] NEGATED_TEST = NO_TEST;
+        { "C.html", "src-html/C.html#line.7"}};
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             "-linksource",  SRC_DIR + "/C.java"};
 
     /**
@@ -50,21 +48,7 @@
      */
     public static void main(String[] args) {
         TestBackSlashInLink tester = new TestBackSlashInLink();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,10 +35,6 @@
 
 public class TestBadPackageFileInJar extends JavadocTester {
 
-    protected static final String FS = System.getProperty("file.separator");
-
-    private static final String BUG_ID = "4691095";
-
     private static final String[][] TEST =
         new String[][] {
             {ERROR_OUTPUT,
@@ -47,7 +43,7 @@
 
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR, "-classpath",
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-classpath",
             SRC_DIR + "/badPackageFileInJar.jar", "pkg"};
 
 
@@ -57,21 +53,7 @@
      */
     public static void main(String[] args) {
         TestBadPackageFileInJar tester = new TestBadPackageFileInJar();
-        run(tester, ARGS, TEST, NO_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,40 +35,19 @@
 
 public class TestBadSourceFile extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4835749";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-Xdoclint:none", "-d", BUG_ID, SRC_DIR + "/C2.java"
+        "-Xdoclint:none", "-d", OUTPUT_DIR, SRC_DIR + "/C2.java"
     };
 
-    //Input for string search tests.
-    private static final String[][] TEST = NO_TEST;
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
     /**
      * The entry point of the test.
      * @param args the array of command line arguments.
      */
     public static void main(String[] args) {
         TestBadSourceFile tester = new TestBadSourceFile();
-        int exitCode = run(tester, ARGS, TEST, NEGATED_TEST);
+        int exitCode = tester.run(ARGS, NO_TEST, NO_TEST);
         tester.checkExitCode(0, exitCode);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testBaseClass/TestBaseClass.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testBaseClass/TestBaseClass.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,9 +35,6 @@
 
 public class TestBaseClass extends JavadocTester {
 
-    private static final String BUG_ID = "4197513";
-    private static final String[][] TEST = NO_TEST;
-    private static final String[][] NEGATED_TEST = NO_TEST;
     private static final String[] ARGS =
         new String[] {
             "-sourcepath", SRC_DIR,
@@ -50,22 +47,8 @@
      */
     public static void main(String[] args) {
         TestBaseClass tester = new TestBaseClass();
-        if (run(tester, ARGS, TEST, NEGATED_TEST) != 0) {
+        if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) {
             throw new Error("Javadoc failed to execute.");
         }
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java	Thu Apr 24 16:04:44 2014 -0700
@@ -37,14 +37,12 @@
 
 public class TestBreakIterator extends JavadocTester {
 
-    private static final String BUG_ID = "4165985";
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/BreakIteratorTest.html",
+        { "pkg/BreakIteratorTest.html",
             "The class is empty (i.e. it has no members)."}};
-    private static final String[][] NEGATED_TEST = NO_TEST;
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             "-breakiterator", "pkg"};
 
     /**
@@ -53,21 +51,7 @@
      */
     public static void main(String[] args) {
         TestBreakIterator tester = new TestBreakIterator();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java	Thu Apr 24 16:04:44 2014 -0700
@@ -37,21 +37,17 @@
 
 public class TestCRLineSeparator extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4979486-8014636";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", ".", "pkg"
+        "-d", OUTPUT_DIR, "-sourcepath", ".", "pkg"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/MyClass.html", "Line 1\n" +
+        { "pkg/MyClass.html", "Line 1\n" +
         " Line 2"}
     };
 
-    private static final String[][] NEGATED_TEST = NO_TEST;
 
     /**
      * The entry point of the test.
@@ -60,24 +56,10 @@
     public static void main(String[] args) throws Exception {
         initFiles(new File(SRC_DIR), new File("."), "pkg");
         TestCRLineSeparator tester = new TestCRLineSeparator();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
-
     // recursively copy files from fromDir to toDir, replacing newlines
     // with \r
     static void initFiles(File fromDir, File toDir, String f) throws IOException {
--- a/test/com/sun/javadoc/testCharset/TestCharset.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testCharset/TestCharset.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,25 +34,22 @@
 
 public class TestCharset extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "7052170";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-charset", "UTF-8", "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR, "-charset", "UTF-8", "-sourcepath", SRC_DIR, "pkg"
     };
 
     private static final String[][] TEST = {
-        {BUG_ID + "/index.html",
+        { "index.html",
             "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"},
-        {BUG_ID + "/pkg/Foo.html",
+        { "pkg/Foo.html",
             "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"}
     };
 
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/index.html",
+        { "index.html",
             "<meta http-equiv=\"Content-Type\" content=\"text/html\" charset=\"UTF-8\">"},
-        {BUG_ID + "/pkg/Foo.html",
+        { "pkg/Foo.html",
             "<meta http-equiv=\"Content-Type\" content=\"text/html\" charset=\"UTF-8\">"}
     };
 
@@ -62,21 +59,7 @@
      */
     public static void main(String[] args) {
         TestCharset tester = new TestCharset();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,29 +34,27 @@
 
 public class TestClassCrossReferences extends JavadocTester {
 
-    private static final String BUG_ID = "4652655-4857717";
     private static final String[][] TEST = {
-        {BUG_ID + "/C.html",
+        { "C.html",
             "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/math/package-summary.html?is-external=true\"><code>Link to math package</code></a>"},
-        {BUG_ID + "/C.html",
+        { "C.html",
             "<a href=\"http://java.sun.com/j2se/1.4/docs/api/javax/swing/text/AbstractDocument.AttributeContext.html?is-external=true\" " +
             "title=\"class or interface in javax.swing.text\"><code>Link to AttributeContext innerclass</code></a>"},
-        {BUG_ID + "/C.html",
+        { "C.html",
             "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/math/BigDecimal.html?is-external=true\" " +
                 "title=\"class or interface in java.math\"><code>Link to external class BigDecimal</code></a>"},
-        {BUG_ID + "/C.html",
+        { "C.html",
             "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/math/BigInteger.html?is-external=true#gcd-java.math.BigInteger-\" " +
                 "title=\"class or interface in java.math\"><code>Link to external member gcd</code></a>"},
-        {BUG_ID + "/C.html",
+        { "C.html",
             "<dl>\n" +
             "<dt><span class=\"overrideSpecifyLabel\">Overrides:</span></dt>\n" +
             "<dd><code>toString</code>&nbsp;in class&nbsp;<code>java.lang.Object</code></dd>\n" +
             "</dl>"}
     };
-    private static final String[][] NEGATED_TEST = NO_TEST;
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/",
             SRC_DIR, SRC_DIR + "/C.java"};
 
@@ -66,21 +64,7 @@
      */
     public static void main(String[] args) {
         TestClassCrossReferences tester = new TestClassCrossReferences();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testClassTree/TestClassTree.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testClassTree/TestClassTree.java	Thu Apr 24 16:04:44 2014 -0700
@@ -37,22 +37,19 @@
 
 public class TestClassTree extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4632553-4973607";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/package-tree.html",
+        { "pkg/package-tree.html",
             "<ul>\n" +
             "<li type=\"circle\">pkg.<a href=\"../pkg/ParentClass.html\" " +
             "title=\"class in pkg\"><span class=\"typeNameLink\">ParentClass</span></a>"},
 
-        {BUG_ID + "/pkg/package-tree.html",
+        { "pkg/package-tree.html",
             "<h2 title=\"Annotation Type Hierarchy\">Annotation Type Hierarchy</h2>\n" +
             "<ul>\n" +
             "<li type=\"circle\">pkg.<a href=\"../pkg/AnnotationType.html\" " +
@@ -60,7 +57,7 @@
             "(implements java.lang.annotation.Annotation)</li>\n" +
             "</ul>"},
 
-        {BUG_ID + "/pkg/package-tree.html",
+        { "pkg/package-tree.html",
             "<h2 title=\"Enum Hierarchy\">Enum Hierarchy</h2>\n" +
             "<ul>\n" +
             "<li type=\"circle\">java.lang.Object\n" +
@@ -78,7 +75,7 @@
         },
     };
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/pkg/package-tree.html",
+        { "pkg/package-tree.html",
             "<li type=\"circle\">class pkg.<a href=\"../pkg/ParentClass.html\" " +
             "title=\"class in pkg\"><span class=\"typeNameLink\">ParentClass</span></a></li>"}
         };
@@ -89,21 +86,7 @@
      */
     public static void main(String[] args) {
         TestClassTree tester = new TestClassTree();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java	Thu Apr 24 16:04:44 2014 -0700
@@ -38,8 +38,6 @@
 
     private static final String OUTPUT_DIR1 = "4506980-tmp1";
     private static final String OUTPUT_DIR2 = "4506980-tmp2";
-    private static final String[][] TEST = NO_TEST;
-    private static final String[][] NEGATED_TEST = NO_TEST;
     private static final String[] ARGS1 =
         new String[] {
             "-d", OUTPUT_DIR1, "-sourcepath", SRC_DIR,
@@ -54,15 +52,14 @@
             SRC_DIR + "/pkg2/C3.java",
             SRC_DIR + "/pkg2/C4.java"
         };
-    private static final String[][] FILES_TO_DIFF = {
-        {OUTPUT_DIR1 + "/C5.html", OUTPUT_DIR2 + "/C5.html"},
-        {OUTPUT_DIR2 + "/pkg1/C1.html", OUTPUT_DIR2 + "/pkg1/C1.html"},
-        {OUTPUT_DIR1 + "/pkg1/C2.html", OUTPUT_DIR2 + "/pkg1/C2.html"},
-        {OUTPUT_DIR1 + "/pkg2/C3.html", OUTPUT_DIR2 + "/pkg2/C3.html"},
-        {OUTPUT_DIR1 + "/pkg2/C4.html", OUTPUT_DIR2 + "/pkg2/C4.html"}
+    private static final String[] FILES_TO_DIFF = {
+        "C5.html",
+        "pkg1/C1.html",
+        "pkg1/C2.html",
+        "pkg2/C3.html",
+        "pkg2/C4.html"
     };
 
-    private static final String BUG_ID = "4506980";
 
     /**
      * The entry point of the test.
@@ -70,22 +67,8 @@
      */
     public static void main(String[] args) {
         TestCmndLineClass tester = new TestCmndLineClass();
-        run(tester, ARGS1, TEST, NEGATED_TEST);
-        run(tester, ARGS2, TEST, NEGATED_TEST);
-        tester.runDiffs(FILES_TO_DIFF);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
+        tester.run(ARGS1, NO_TEST, NO_TEST);
+        tester.run(ARGS2, NO_TEST, NO_TEST);
+        tester.runDiffs(OUTPUT_DIR1, OUTPUT_DIR2, FILES_TO_DIFF);
     }
 }
--- a/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,8 +33,6 @@
 
 public class TestCompletionFailure extends JavadocTester {
 
-    private static final String BUG_ID = "8027977";
-
     //Input for string search tests.
     private static final String[][] NEGATED_TEST = {
         {ERROR_OUTPUT, "TestCompletionFailure: error - " +
@@ -44,7 +42,7 @@
     };
 
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1"
     };
 
     /**
@@ -53,21 +51,7 @@
      */
     public static void main(String[] args) throws Exception {
         TestCompletionFailure tester = new TestCompletionFailure();
-        run(tester, ARGS, NO_TEST, NEGATED_TEST);
+        tester.run(ARGS, NO_TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,14 +35,12 @@
 
 public class TestConstantValuesPage extends JavadocTester {
 
-    private static final String BUG_ID = "4681599";
-    private static final String[][] TEST = NO_TEST;
     private static final String[][] NEGATED_TEST = {
         {NOTICE_OUTPUT, "constant-values.html..."}
         };
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR, "foo"};
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "foo"};
 
     /**
      * The entry point of the test.
@@ -50,21 +48,7 @@
      */
     public static void main(String[] args) {
         TestConstantValuesPage tester = new TestConstantValuesPage();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, NO_TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,17 +35,14 @@
 
 public class TestConstructorIndent extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4904037";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/C.html", "<div class=\"block\">" +
+        { "C.html", "<div class=\"block\">" +
                  "This is just a simple constructor.</div>\n" +
                  "<dl>\n" +
                  "<dt><span class=\"paramLabel\">Parameters:</span></dt>\n" +
@@ -53,7 +50,6 @@
                  "</dl>"
         }
     };
-    private static final String[][] NEGATED_TEST = NO_TEST;
 
     /**
      * The entry point of the test.
@@ -61,21 +57,7 @@
      */
     public static void main(String[] args) {
         TestConstructorIndent tester = new TestConstructorIndent();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testConstructors/TestConstructors.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testConstructors/TestConstructors.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,11 +33,9 @@
 
 public class TestConstructors extends JavadocTester {
 
-    private static final String BUG_ID = "8025524";
-
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<dt><span class=\"seeLabel\">See Also:</span></dt>\n" +
             "<dd><a href=\"../pkg1/Outer.Inner.html#Inner--\"><code>Inner()</code></a>, \n" +
             "<a href=\"../pkg1/Outer.Inner.html#Inner-int-\"><code>Inner(int)</code></a>, \n" +
@@ -46,79 +44,79 @@
             "<a href=\"../pkg1/Outer.html#Outer--\"><code>Outer()</code></a>, \n" +
             "<a href=\"../pkg1/Outer.html#Outer-int-\"><code>Outer(int)</code></a>"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "Link: <a href=\"../pkg1/Outer.Inner.html#Inner--\"><code>Inner()</code></a>, " +
             "<a href=\"../pkg1/Outer.html#Outer-int-\"><code>Outer(int)</code></a>, " +
             "<a href=\"../pkg1/Outer.Inner.NestedInner.html#NestedInner-int-\"><code>" +
             "NestedInner(int)</code></a>"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a href=\"../pkg1/Outer.html#Outer--\">Outer</a></span>()"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a name=\"Outer--\">"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a href=\"../pkg1/Outer.html#Outer-int-\">Outer</a></span>(int&nbsp;i)"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a name=\"Outer-int-\">"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.html",
+        { "pkg1/Outer.Inner.html",
             "<a href=\"../pkg1/Outer.Inner.html#Inner--\">Inner</a></span>()"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.html",
+        { "pkg1/Outer.Inner.html",
             "<a name=\"Inner--\">"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.html",
+        { "pkg1/Outer.Inner.html",
             "<a href=\"../pkg1/Outer.Inner.html#Inner-int-\">Inner</a></span>(int&nbsp;i)"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.html",
+        { "pkg1/Outer.Inner.html",
             "<a name=\"Inner-int-\">"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.NestedInner.html",
+        { "pkg1/Outer.Inner.NestedInner.html",
             "<a href=\"../pkg1/Outer.Inner.NestedInner.html#NestedInner--\">NestedInner</a></span>()"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.NestedInner.html",
+        { "pkg1/Outer.Inner.NestedInner.html",
             "<a name=\"NestedInner--\">"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.NestedInner.html",
+        { "pkg1/Outer.Inner.NestedInner.html",
             "<a href=\"../pkg1/Outer.Inner.NestedInner.html#NestedInner-int-\">NestedInner</a></span>(int&nbsp;i)"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.NestedInner.html",
+        { "pkg1/Outer.Inner.NestedInner.html",
             "<a name=\"NestedInner-int-\">"
         }
     };
 
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/pkg1/Outer.Inner.html",
+        { "pkg1/Outer.Inner.html",
             "Outer.Inner--"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.html",
+        { "pkg1/Outer.Inner.html",
             "Outer.Inner-int-"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.NestedInner.html",
+        { "pkg1/Outer.Inner.NestedInner.html",
             "Outer.Inner.NestedInner--"
         },
-        {BUG_ID + "/pkg1/Outer.Inner.NestedInner.html",
+        { "pkg1/Outer.Inner.NestedInner.html",
             "Outer.Inner.NestedInner-int-"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a href=\"../pkg1/Outer.Inner.html#Outer.Inner--\"><code>Outer.Inner()</code></a>"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a href=\"../pkg1/Outer.Inner.html#Outer.Inner-int-\"><code>Outer.Inner(int)</code></a>"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a href=\"../pkg1/Outer.Inner.NestedInner.html#Outer.Inner.NestedInner--\"><code>Outer.Inner.NestedInner()</code></a>"
         },
-        {BUG_ID + "/pkg1/Outer.html",
+        { "pkg1/Outer.html",
             "<a href=\"../pkg1/Outer.Inner.NestedInner.html#Outer.Inner.NestedInner-int-\"><code>Outer.Inner.NestedInner(int)</code></a>"
         }
     };
 
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1"
     };
 
     /**
@@ -127,21 +125,7 @@
      */
     public static void main(String[] args) throws Exception {
         TestConstructors tester = new TestConstructors();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testCustomTag/TestCustomTag.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testCustomTag/TestCustomTag.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,28 +33,25 @@
 
 public class TestCustomTag extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "8006248";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-Xdoclint:none", "-d", BUG_ID, "-tagletpath", SRC_DIR,
+        "-Xdoclint:none", "-d", OUTPUT_DIR, "-tagletpath", SRC_DIR,
         "-taglet", "taglets.CustomTag", "-sourcepath",
         SRC_DIR, SRC_DIR + "/TagTestClass.java"
     };
 
     private static final String[] ARGS1 = new String[] {
-        "-d", BUG_ID + "-1", "-tagletpath",
+        "-d", OUTPUT_DIR + "-1", "-tagletpath",
         SRC_DIR, "-taglet", "taglets.CustomTag",
         "-sourcepath", SRC_DIR, SRC_DIR + "/TagTestClass.java"
     };
     private static final String[] ARGS2 = new String[] {
-        "-Xdoclint:none", "-d", BUG_ID + "-2", "-sourcepath",
+        "-Xdoclint:none", "-d", OUTPUT_DIR + "-2", "-sourcepath",
         SRC_DIR, SRC_DIR + "/TagTestClass.java"
     };
 
     private static final String[] ARGS3 = new String[] {
-        "-d", BUG_ID + "-3", "-sourcepath",
+        "-d", OUTPUT_DIR + "-3", "-sourcepath",
         SRC_DIR, SRC_DIR + "/TagTestClass.java"
     };
 
@@ -88,24 +85,10 @@
      */
     public static void main(String[] args) {
         TestCustomTag tester = new TestCustomTag();
-        run(tester, ARGS, TEST, NO_TEST);
-        run(tester, ARGS1, TEST1, NO_TEST);
-        run(tester, ARGS2, TEST2, NO_TEST);
-        run(tester, ARGS3, TEST3, NO_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
+        tester.run(ARGS1, TEST1, NO_TEST);
+        tester.run(ARGS2, TEST2, NO_TEST);
+        tester.run(ARGS3, TEST3, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,19 +33,16 @@
 
 public class TestDeprecatedDocs extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4927552";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"
     };
 
     private static final String TARGET_FILE  =
-        BUG_ID + "/deprecated-list.html";
+        "deprecated-list.html";
 
     private static final String TARGET_FILE2  =
-        BUG_ID + "/pkg/DeprecatedClassByAnnotation.html";
+        "pkg/DeprecatedClassByAnnotation.html";
 
     //Input for string search tests.
     private static final String[][] TEST = {
@@ -92,29 +89,13 @@
                  "<div class=\"block\"><span class=\"deprecatedLabel\">Deprecated.</span>&nbsp;</div>"},
     };
 
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
     /**
      * The entry point of the test.
      * @param args the array of command line arguments.
      */
     public static void main(String[] args) {
         TestDeprecatedDocs tester = new TestDeprecatedDocs();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java	Thu Apr 24 16:04:44 2014 -0700
@@ -38,19 +38,17 @@
 
 public class TestDocEncoding extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "8000743";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-docencoding", "Cp930",
-        "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR,
+        "-docencoding", "Cp930",
+        "-sourcepath", SRC_DIR,
+        "-notimestamp",
+        "pkg"
     };
 
-    private static final String[][] TEST = NO_TEST;
-
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/stylesheet.css",
+        { "stylesheet.css",
             "body {\n" +
             "    background-color:#ffffff;"}
     };
@@ -61,22 +59,8 @@
      */
     public static void main(String[] args) {
         TestDocEncoding tester = new TestDocEncoding();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, NO_TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
 
--- a/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,19 +35,12 @@
 
 public class TestDocErrorReporter extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4927928";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "-encoding", "xyz",
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-encoding", "xyz",
             SRC_DIR + "/TestDocErrorReporter.java"
     };
 
-    //Input for string search tests.
-    private static final String[][] TEST = NO_TEST;
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
     //Input for Javadoc return code test.
     private static final int EXPECTED_EXIT_CODE = 1;
 
@@ -57,22 +50,8 @@
      */
     public static void main(String[] args) {
         TestDocErrorReporter tester = new TestDocErrorReporter();
-        int actualExitCode = run(tester, ARGS, TEST, NEGATED_TEST);
+        int actualExitCode = tester.run(ARGS, NO_TEST, NO_TEST);
         tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java	Thu Apr 24 16:04:44 2014 -0700
@@ -39,45 +39,37 @@
 
 public class TestDocFileDir extends JavadocTester {
 
-    private static final String BUG_ID = "4258405-4973606";
-
     private static final String[][] TEST1 = {
-        {BUG_ID + "-1/pkg/doc-files/testfile.txt",
+        { "pkg/doc-files/testfile.txt",
             "This doc file did not get trashed."}
         };
-    private static final String[][] NEGATED_TEST1 = NO_TEST;
 
     private static final String[] FILE_TEST2 = {
-        BUG_ID + "-2/pkg/doc-files/subdir-used1" +
-            "/testfile.txt",
-        BUG_ID + "-2/pkg/doc-files/subdir-used2" +
-            "/testfile.txt"
+        "pkg/doc-files/subdir-used1/testfile.txt",
+        "pkg/doc-files/subdir-used2/testfile.txt"
     };
     private static final String[] FILE_NEGATED_TEST2 = {
-        BUG_ID + "-2/pkg/doc-files/subdir-excluded1" +
-            "/testfile.txt",
-        BUG_ID + "-2/pkg/doc-files/subdir-excluded2" +
-            "/testfile.txt"
+        "pkg/doc-files/subdir-excluded1/testfile.txt",
+        "pkg/doc-files/subdir-excluded2/testfile.txt"
     };
 
     private static final String[][] TEST0 = {
         {"pkg/doc-files/testfile.txt",
             "This doc file did not get trashed."}
         };
-    private static final String[][] NEGATED_TEST0 = {};
 
     //Output dir = Input Dir
     private static final String[] ARGS1 =
         new String[] {
-            "-d", BUG_ID + "-1",
+            "-d", OUTPUT_DIR + "-1",
             "-sourcepath",
-            "blah" + File.pathSeparator + BUG_ID + "-1" +
+            "blah" + File.pathSeparator + OUTPUT_DIR + "-1" +
             File.pathSeparator + "blah", "pkg"};
 
     //Exercising -docfilessubdirs and -excludedocfilessubdir
     private static final String[] ARGS2 =
         new String[] {
-            "-d", BUG_ID + "-2",
+            "-d", OUTPUT_DIR + "-2",
             "-sourcepath", SRC_DIR,
             "-docfilessubdirs",
             "-excludedocfilessubdir", "subdir-excluded1:subdir-excluded2",
@@ -95,24 +87,10 @@
     public static void main(String[] args) {
         TestDocFileDir tester = new TestDocFileDir();
         copyDir(SRC_DIR + "/pkg", ".");
-        run(tester, ARGS0, TEST0, NEGATED_TEST0);
-        copyDir(SRC_DIR + "/pkg", BUG_ID + "-1");
-        run(tester, ARGS1, TEST1, NEGATED_TEST1);
-        run(tester, ARGS2, NO_TEST, NO_TEST, FILE_TEST2, FILE_NEGATED_TEST2);
+        tester.run(ARGS0, TEST0, NO_TEST);
+        copyDir(SRC_DIR + "/pkg", OUTPUT_DIR + "-1");
+        tester.run(ARGS1, TEST1, NO_TEST);
+        tester.run(ARGS2, NO_TEST, NO_TEST, FILE_TEST2, FILE_NEGATED_TEST2);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testDocFiles/TestDocFiles.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDocFiles/TestDocFiles.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,9 +33,8 @@
 
 public class TestDocFiles extends JavadocTester {
 
-    private static final String BUG_ID = "8008949";
     private static final String[][] TEST = {
-        {"tmp/pkg/doc-files/test.txt", "test file"}};
+        { "pkg/doc-files/test.txt", "test file"}};
 
     private static final String[] ARGS =
         new String[] {
@@ -47,21 +46,7 @@
      */
     public static void main(String[] args) {
         TestDocFiles tester = new TestDocFiles();
-        run(tester, ARGS, TEST, NO_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java	Thu Apr 24 16:04:44 2014 -0700
@@ -36,25 +36,23 @@
 
 public class TestDocRootInlineTag extends JavadocTester {
 
-    private static final String BUG_ID = "4369014-4851991";
     private static final String[][] TEST = {
-        {BUG_ID + "/TestDocRootTag.html",
+        { "TestDocRootTag.html",
             "<a href=\"http://www.java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" " +
             "title=\"class or interface in java.io\"><code>File</code></a>"},
-        {BUG_ID + "/TestDocRootTag.html",
+        { "TestDocRootTag.html",
             "<a href=\"./glossary.html\">glossary</a>"},
-        {BUG_ID + "/TestDocRootTag.html",
+        { "TestDocRootTag.html",
             "<a href=\"http://www.java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" " +
             "title=\"class or interface in java.io\"><code>Second File Link</code></a>"},
-        {BUG_ID + "/TestDocRootTag.html", "The value of @docRoot is \"./\""},
-        {BUG_ID + "/index-all.html", "My package page is " +
+        { "TestDocRootTag.html", "The value of @docRoot is \"./\""},
+        { "index-all.html", "My package page is " +
             "<a href=\"./pkg/package-summary.html\">here</a>"}
     };
-    private static final String[][] NEGATED_TEST = NO_TEST;
     private static final String[] ARGS =
         new String[] {
             "-bottom", "The value of @docRoot is \"{@docRoot}\"",
-            "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             "-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api",
             SRC_DIR, SRC_DIR + "/TestDocRootTag.java", "pkg"
         };
@@ -65,21 +63,7 @@
      */
     public static void main(String[] args) {
         TestDocRootInlineTag tester = new TestDocRootInlineTag();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java	Thu Apr 24 16:04:44 2014 -0700
@@ -32,92 +32,91 @@
  */
 public class TestDocRootLink extends JavadocTester {
 
-    private static final String BUG_ID = "6553182";
     private static final String[][] TEST1 = {
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "Refer <a href=\"../../technotes/guides/index.html\">Here</a>"
         },
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "This <a href=\"../pkg2/C2.html\">Here</a> should not be replaced\n" +
             " with an absolute link."
         },
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "Testing <a href=\"../technotes/guides/index.html\">Link 1</a> and\n" +
             " <a href=\"../pkg2/C2.html\">Link 2</a>."
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<a href=\"../../technotes/guides/index.html\">\n" +
             "            Test document 1</a>"
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<a href=\"../pkg2/C2.html\">\n" +
             "            Another Test document 1</a>"
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<a href=\"../technotes/guides/index.html\">\n" +
             "            Another Test document 2.</a>"
         }
     };
     private static final String[][] NEGATED_TEST1 = {
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">"
         },
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<a href=\"http://download.oracle.com/javase/7/docs/pkg2/C2.html\">"
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">"
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<a href=\"http://download.oracle.com/javase/7/docs/pkg2/C2.html\">"
         }
     };
     private static final String[][] TEST2 = {
-        {BUG_ID + "-1/pkg2/C2.html",
+        { "pkg2/C2.html",
             "Refer <a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">Here</a>"
         },
-        {BUG_ID + "-1/pkg2/C2.html",
+        { "pkg2/C2.html",
             "This <a href=\"../pkg1/C1.html\">Here</a> should not be replaced\n" +
             " with an absolute link."
         },
-        {BUG_ID + "-1/pkg2/C2.html",
+        { "pkg2/C2.html",
             "Testing <a href=\"../technotes/guides/index.html\">Link 1</a> and\n" +
             " <a href=\"../pkg1/C1.html\">Link 2</a>."
         },
-        {BUG_ID + "-1/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<a href=\"http://download.oracle.com/javase/7/docs/technotes/guides/index.html\">\n" +
             "            Test document 1</a>"
         },
-        {BUG_ID + "-1/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<a href=\"../pkg1/C1.html\">\n" +
             "            Another Test document 1</a>"
         },
-        {BUG_ID + "-1/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<a href=\"../technotes/guides/index.html\">\n" +
             "            Another Test document 2.</a>"
         }
     };
     private static final String[][] NEGATED_TEST2 = {
-        {BUG_ID + "-1/pkg2/C2.html",
+        { "pkg2/C2.html",
             "<a href=\"../../technotes/guides/index.html\">"
         },
-        {BUG_ID + "-1/pkg2/C2.html",
+        { "pkg2/C2.html",
             "<a href=\"http://download.oracle.com/javase/7/docs/pkg1/C1.html\">"
         },
-        {BUG_ID + "-1/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<a href=\"../../technotes/guides/index.html\">"
         },
-        {BUG_ID + "-1/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<a href=\"http://download.oracle.com/javase/7/docs/pkg1/C1.html\">"
         }
     };
     private static final String[] ARGS1 =
             new String[]{
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1", "pkg2"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1", "pkg2"
     };
     private static final String[] ARGS2 =
             new String[]{
-        "-d", BUG_ID + "-1", "-Xdocrootparent",
+        "-d", OUTPUT_DIR + "-1", "-Xdocrootparent",
         "http://download.oracle.com/javase/7/docs", "-sourcepath",
         SRC_DIR, "pkg1", "pkg2"
     };
@@ -128,22 +127,8 @@
      */
     public static void main(String[] args) {
         TestDocRootLink tester = new TestDocRootLink();
-        run(tester, ARGS1, TEST1, NEGATED_TEST1);
-        run(tester, ARGS2, TEST2, NEGATED_TEST2);
+        tester.run(ARGS1, TEST1, NEGATED_TEST1);
+        tester.run(ARGS2, TEST2, NEGATED_TEST2);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,9 +35,8 @@
 
 public class TestDupParamWarn extends JavadocTester {
 
-    private static final String BUG_ID = "4745855";
     private static final String[] ARGS =
-        new String[] {"-d", BUG_ID, "-sourcepath",
+        new String[] {"-d", OUTPUT_DIR, "-sourcepath",
                 SRC_DIR + "/", "pkg"};
     private static final String[][] NEGATED_TEST =
         new String[][] {{WARNING_OUTPUT,
@@ -48,20 +47,8 @@
      * @param args the array of command line arguments.
      */
     public static void main(String[] args) {
-        run(new TestDupParamWarn(), ARGS, NO_TEST, NEGATED_TEST);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
+        JavadocTester tester = new TestDupParamWarn();
+        tester.run(ARGS, NO_TEST, NEGATED_TEST);
+        tester.printSummary();
     }
 }
--- a/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,15 +35,13 @@
 
 public class TestEmptyClass extends JavadocTester {
 
-    private static final String OUTPUT_DIR = "tmp";
-    private static final String[][] TEST = NO_TEST;
     private static final String[][] NEGATED_TEST = {
 
         //The overview tree should not link to classes that were not documented
-        {OUTPUT_DIR + "/overview-tree.html", "<A HREF=\"TestEmptyClass.html\">"},
+        { "overview-tree.html", "<A HREF=\"TestEmptyClass.html\">"},
 
         //The index page should not link to classes that were not documented
-        {OUTPUT_DIR + "/index-all.html", "<A HREF=\"TestEmptyClass.html\">"},
+        { "index-all.html", "<A HREF=\"TestEmptyClass.html\">"},
     };
     private static final String[] ARGS =
         new String[] {
@@ -51,8 +49,6 @@
             "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR + "/src",
             SRC_DIR + "/src/Empty.java"
         };
-    private static final String BUG_ID =
-        "4483401 4483407 4483409 4483413 4494343";
 
     /**
      * The entry point of the test.
@@ -60,24 +56,10 @@
      */
     public static void main(String[] args) {
         TestEmptyClass tester = new TestEmptyClass();
-        int exitCode = run(tester, ARGS, TEST, NEGATED_TEST);
+        int exitCode = tester.run(ARGS, NO_TEST, NEGATED_TEST);
         tester.printSummary();
         if (exitCode != 0) {
             throw new Error("Error found while executing Javadoc");
         }
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,19 +34,15 @@
 
 public class TestEnclosingClass extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "5008230";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/MyClass.MyInterface.html", "Enclosing class:"}
+        { "pkg/MyClass.MyInterface.html", "Enclosing class:"}
     };
-    private static final String[][] NEGATED_TEST = NO_TEST;
 
     /**
      * The entry point of the test.
@@ -54,21 +50,7 @@
      */
     public static void main(String[] args) {
         TestEnclosingClass tester = new TestEnclosingClass();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testEncoding/TestEncoding.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testEncoding/TestEncoding.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,16 +35,14 @@
 
 public class TestEncoding extends JavadocTester {
 
-    private static final String BUG_ID = "4661481";
-    private static final String[][] TEST = NO_TEST;
 
     //If ??? is found in the output, the source file was not read with the correct encoding setting.
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/EncodeTest.html", "??"}
+        { "EncodeTest.html", "??"}
     };
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             "-encoding", "iso-8859-1", SRC_DIR + "/EncodeTest.java"
         };
 
@@ -54,21 +52,7 @@
      */
     public static void main(String[] args) {
         TestEncoding tester = new TestEncoding();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, NO_TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,28 +35,23 @@
 
 public class TestExternalOverridenMethod extends JavadocTester {
 
-    private static final String BUG_ID = "4857717";
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg/XReader.html",
+        { "pkg/XReader.html",
             "<dt><span class=\"overrideSpecifyLabel\">Overrides:</span></dt>\n" +
             "<dd><code><a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/FilterReader.html?is-external=true#read--\" " +
             "title=\"class or interface in java.io\">read</a></code>&nbsp;in class&nbsp;<code>" +
             "<a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/FilterReader.html?is-external=true\" " +
             "title=\"class or interface in java.io\">FilterReader</a></code></dd>"},
-        {BUG_ID + "/pkg/XReader.html",
+        { "pkg/XReader.html",
             "<dt><span class=\"overrideSpecifyLabel\">Specified by:</span></dt>\n" +
             "<dd><code><a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInput.html?is-external=true#readInt--\" " +
             "title=\"class or interface in java.io\">readInt</a></code>&nbsp;in interface&nbsp;<code>" +
             "<a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInput.html?is-external=true\" " +
             "title=\"class or interface in java.io\">DataInput</a></code></dd>"}};
 
-
-
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             "-linkoffline", "http://java.sun.com/j2se/1.4.1/docs/api", SRC_DIR,
             "pkg"
         };
@@ -67,21 +62,7 @@
      */
     public static void main(String[] args) {
         TestExternalOverridenMethod tester = new TestExternalOverridenMethod();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java	Thu Apr 24 16:04:44 2014 -0700
@@ -32,8 +32,6 @@
 
 public class TestGeneratedBy extends JavadocTester {
 
-    private static final String OUTPUT_DIR = "tmp";
-
     private static final String[] FILES = {
         "pkg/MyClass.html",
         "pkg/package-summary.html",
@@ -65,7 +63,6 @@
             "pkg"
         };
 
-    private static final String BUG_ID = "8000418-8024288";
 
     private static String[][] getTests(boolean timestamp) {
         String version = System.getProperty("java.version");
@@ -74,7 +71,7 @@
             String genBy = "Generated by javadoc";
             if (timestamp) genBy += " (" + version + ") on ";
             tests[i] = new String[] {
-                OUTPUT_DIR + "/" + FILES[i], genBy
+                FILES[i], genBy
             };
         }
         return tests;
@@ -84,7 +81,7 @@
         String[][] tests = new String[FILES.length][];
         for (int i = 0; i < FILES.length; i++) {
             tests[i] = new String[] {
-                OUTPUT_DIR + "/" + FILES[i],
+                FILES[i],
                 (timestamp
                     ? "Generated by javadoc (version"
                     : "Generated by javadoc ("),
@@ -100,26 +97,12 @@
      */
     public static void main(String[] args) {
         TestGeneratedBy tester = new TestGeneratedBy();
-        int ec1 = run(tester, STD_ARGS, getTests(true), getNegatedTests(true));
-        int ec2 = run(tester, NO_TIMESTAMP_ARGS, getTests(false), getNegatedTests(false));
+        int ec1 = tester.run(STD_ARGS, getTests(true), getNegatedTests(true));
+        int ec2 = tester.run(NO_TIMESTAMP_ARGS, getTests(false), getNegatedTests(false));
         tester.printSummary();
         if (ec1 != 0 || ec2 != 0) {
             throw new Error("Error found while executing Javadoc");
         }
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
 
--- a/test/com/sun/javadoc/testGroupOption/TestGroupOption.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testGroupOption/TestGroupOption.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,12 +35,9 @@
 
 public class TestGroupOption extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4924383";
-
     //Javadoc arguments.
     private static final String[] ARGS1 = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR,
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
         "-group", "Package One", "pkg1",
         "-group", "Package Two", "pkg2",
         "-group", "Package Three", "pkg3",
@@ -48,7 +45,7 @@
     };
 
     private static final String[] ARGS2 = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR,
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
         "-group", "Package One", "pkg1",
         "-group", "Package One", "pkg2",
         "-group", "Package One", "pkg3",
@@ -56,11 +53,9 @@
     };
 
     //Input for string search tests.
-    private static final String[][] TEST1 = NO_TEST;
     private static final String[][] NEGATED_TEST1 = {{WARNING_OUTPUT, "-group"}};
 
     private static final String[][] TEST2 = {{WARNING_OUTPUT, "-group"}};
-    private static final String[][] NEGATED_TEST2 = NO_TEST;
 
     /**
      * The entry point of the test.
@@ -69,26 +64,12 @@
     public static void main(String[] args) {
         //Make sure the warning is not printed when -group is used correctly.
         TestGroupOption tester = new TestGroupOption();
-        run(tester, ARGS1, TEST1, NEGATED_TEST1);
+        tester.run(ARGS1, NO_TEST, NEGATED_TEST1);
         tester.printSummary();
 
         //Make sure the warning is printed when -group is not used correctly.
         tester = new TestGroupOption();
-        run(tester, ARGS2, TEST2, NEGATED_TEST2);
+        tester.run(ARGS2, TEST2, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHeadings/TestHeadings.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHeadings/TestHeadings.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,19 +34,16 @@
 
 public class TestHeadings extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4905786-6259611";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "-use", "-header", "Test Files",
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "-header", "Test Files",
         "pkg1", "pkg2"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
         //Package summary
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<th class=\"colFirst\" scope=\"col\">" +
             "Class</th>\n" +
             "<th class=\"colLast\" scope=\"col\"" +
@@ -54,31 +51,31 @@
         },
 
         // Class documentation
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" +
             "<th class=\"colLast\" scope=\"col\">Field and Description</th>"
         },
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<h3>Methods inherited from class&nbsp;java.lang.Object</h3>"
         },
 
         // Class use documentation
-        {BUG_ID + "/pkg1/class-use/C1.html",
+        { "pkg1/class-use/C1.html",
             "<th class=\"colFirst\" scope=\"col\">Package</th>\n" +
             "<th class=\"colLast\" scope=\"col\">Description</th>"
         },
-        {BUG_ID + "/pkg1/class-use/C1.html",
+        { "pkg1/class-use/C1.html",
             "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>\n" +
             "<th class=\"colLast\" scope=\"col\">Field and Description</th>"
         },
 
         // Deprecated
-        {BUG_ID + "/deprecated-list.html",
+        { "deprecated-list.html",
             "<th class=\"colOne\" scope=\"col\">Method and Description</th>"
         },
 
         // Constant values
-        {BUG_ID + "/constant-values.html",
+        { "constant-values.html",
             "<th class=\"colFirst\" scope=\"col\">" +
             "Modifier and Type</th>\n" +
             "<th scope=\"col\">Constant Field</th>\n" +
@@ -86,32 +83,30 @@
         },
 
         // Serialized Form
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
             "<h2 title=\"Package\">Package&nbsp;pkg1</h2>"
         },
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
             "<h3>Class <a href=\"pkg1/C1.html\" title=\"class in pkg1\">" +
             "pkg1.C1</a> extends java.lang.Object implements Serializable</h3>"
         },
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
             "<h3>Serialized Fields</h3>"
         },
 
         // Overview Frame
-        {BUG_ID + "/overview-frame.html",
+        { "overview-frame.html",
             "<h1 title=\"Test Files\" class=\"bar\">Test Files</h1>"
         },
-        {BUG_ID + "/overview-frame.html",
+        { "overview-frame.html",
             "<title>Overview List</title>"
         },
 
         // Overview Summary
-        {BUG_ID + "/overview-summary.html",
+        { "overview-summary.html",
             "<title>Overview</title>"
-        },
-
+        }
     };
-    private static final String[][] NEGATED_TEST = NO_TEST;
 
     /**
      * The entry point of the test.
@@ -119,21 +114,7 @@
      */
     public static void main(String[] args) {
         TestHeadings tester = new TestHeadings();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHelpFile/TestHelpFile.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHelpFile/TestHelpFile.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,19 +33,14 @@
 
 public class TestHelpFile extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "7132631";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR,
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             SRC_DIR + "/TestHelpFile.java"
     };
 
-    private static final String[][] NEGATED_TEST = NO_TEST;
-
     private static final String[][] TEST = {
-        {BUG_ID + "/help-doc.html",
+        { "help-doc.html",
             "<a href=\"constant-values.html\">Constant Field Values</a>"
         },
     };
@@ -56,21 +51,7 @@
      */
     public static void main(String[] args) {
         TestHelpFile tester = new TestHelpFile();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHelpOption/TestHelpOption.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHelpOption/TestHelpOption.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,17 +34,14 @@
 
 public class TestHelpOption extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4934778-4777599-6553182";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "-help",
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-help",
             SRC_DIR + "/TestHelpOption.java"
     };
 
     private static final String[] ARGS2 = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR,
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             SRC_DIR + "/TestHelpOption.java"
     };
 
@@ -86,14 +83,12 @@
         {STANDARD_OUTPUT, "-stylesheetfile "},
         {STANDARD_OUTPUT, "-docencoding "},
     };
-    private static final String[][] NEGATED_TEST = NO_TEST;
 
     private static final String[][] TEST2 = {
-        {BUG_ID + "/TestHelpOption.html",
+        { "TestHelpOption.html",
             "<li><a href=\"help-doc.html\">Help</a></li>"
         },
     };
-    private static final String[][] NEGATED_TEST2 = NO_TEST;
 
     //The help option should not crash the doclet.
     private static final int EXPECTED_EXIT_CODE = 0;
@@ -104,23 +99,9 @@
      */
     public static void main(String[] args) {
         TestHelpOption tester = new TestHelpOption();
-        int actualExitCode = run(tester, ARGS, TEST, NEGATED_TEST);
+        int actualExitCode = tester.run(ARGS, TEST, NO_TEST);
         tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode);
-        run(tester, ARGS2, TEST2, NEGATED_TEST2);
+        tester.run(ARGS2, TEST2, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,18 +35,16 @@
 
 public class TestHiddenMembers extends JavadocTester {
 
-    private static final String BUG_ID = "4492178";
-    private static final String[][] TEST = NO_TEST;
 
     //We should not inherit any members from BaseClass because they are all overriden and hidden
     //(declared as private).
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/pkg/SubClass.html",
+        { "pkg/SubClass.html",
             "inherited from class pkg.<A HREF=\"../pkg/BaseClass.html\">BaseClass</A>"}
         };
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR,
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR,
             "pkg"
         };
 
@@ -56,21 +54,7 @@
      */
     public static void main(String[] args) {
         TestHiddenMembers tester = new TestHiddenMembers();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, NO_TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHref/TestHref.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHref/TestHref.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,54 +33,51 @@
 
 public class TestHref extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4663254";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "-linkoffline",
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-linkoffline",
         "http://java.sun.com/j2se/1.4/docs/api/", SRC_DIR, "pkg"
     };
 
     //Input for string search tests.
     private static final String[][] TEST = {
         //External link.
-        {BUG_ID + "/pkg/C1.html",
+        { "pkg/C1.html",
             "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait-long-int-\""
         },
         //Member summary table link.
-        {BUG_ID + "/pkg/C1.html",
+        { "pkg/C1.html",
             "href=\"../pkg/C1.html#method-int-int-java.util.ArrayList-\""
         },
         //Anchor test.
-        {BUG_ID + "/pkg/C1.html",
+        { "pkg/C1.html",
             "<a name=\"method-int-int-java.util.ArrayList-\">\n" +
             "<!--   -->\n" +
             "</a>"
         },
         //Backward compatibility anchor test.
-        {BUG_ID + "/pkg/C1.html",
+        { "pkg/C1.html",
             "<a name=\"method-int-int-java.util.ArrayList-\">\n" +
             "<!--   -->\n" +
             "</a>"
         },
         //{@link} test.
-        {BUG_ID + "/pkg/C2.html",
+        { "pkg/C2.html",
             "Link: <a href=\"../pkg/C1.html#method-int-int-java.util.ArrayList-\">"
         },
         //@see test.
-        {BUG_ID + "/pkg/C2.html",
+        { "pkg/C2.html",
             "See Also:</span></dt>\n" +
             "<dd><a href=\"../pkg/C1.html#method-int-int-java.util.ArrayList-\">"
         },
 
         //Header does not link to the page itself.
-        {BUG_ID + "/pkg/C4.html",
+        { "pkg/C4.html",
             "Class C4&lt;E extends C4&lt;E&gt;&gt;</h2>"
         },
 
         //Signature does not link to the page itself.
-        {BUG_ID + "/pkg/C4.html",
+        { "pkg/C4.html",
             "public abstract class <span class=\"typeNameLabel\">C4&lt;E extends C4&lt;E&gt;&gt;</span>"
         },
     };
@@ -95,21 +92,7 @@
      */
     public static void main(String[] args) {
         TestHref tester = new TestHref();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java	Thu Apr 24 16:04:44 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,12 +35,9 @@
 
 public class TestHrefInDocComment extends JavadocTester {
 
-    private static final String BUG_ID = "4638015";
-    private static final String[][] TEST = NO_TEST;
-    private static final String[][] NEGATED_TEST = NO_TEST;
     private static final String[] ARGS =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg"};
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"};
 
     /**
      * The entry point of the test.
@@ -48,23 +45,8 @@
      */
     public static void main(String[] args) {
         TestHrefInDocComment tester = new TestHrefInDocComment();
-        if (run(tester, ARGS, TEST, NEGATED_TEST) != 0) {
+        if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) {
             throw new Error("Javadoc failed to execute properly with given source.");
         }
-
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
     }
 }
--- a/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,18 +35,14 @@
 
 public class TestHtmlComments extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "4904038";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java"
     };
 
     //Input for string search tests.
-    private static final String[][] TEST = NO_TEST;
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/C.html",
+        { "C.html",
             "<!-- ============ FIELD DETAIL =========== -->"}
     };
 
@@ -56,21 +52,7 @@
      */
     public static void main(String[] args) {
         TestHtmlComments tester = new TestHtmlComments();
-        run(tester, ARGS, TEST, NEGATED_TEST);
+        tester.run(ARGS, NO_TEST, NEGATED_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java	Thu Apr 24 16:04:44 2014 -0700
@@ -35,18 +35,16 @@
 
 public class TestHtmlDefinitionListTag extends JavadocTester {
 
-    private static final String BUG_ID = "6786690-6820360";
-
     // Test common to all runs of javadoc. The class signature should print
     // properly enclosed definition list tags and the Annotation Type
     // Optional Element should print properly nested definition list tags
     // for default value.
     private static final String[][] TEST_ALL = {
-        {BUG_ID + "/pkg1/C1.html", "<pre>public class " +
+        { "pkg1/C1.html", "<pre>public class " +
                  "<span class=\"typeNameLabel\">C1</span>\n" +
                  "extends java.lang.Object\n" +
                  "implements java.io.Serializable</pre>"},
-        {BUG_ID + "/pkg1/C4.html", "<dl>\n" +
+        { "pkg1/C4.html", "<dl>\n" +
                  "<dt>Default:</dt>\n" +
                  "<dd>true</dd>\n" +
                  "</dl>"}};
@@ -55,11 +53,11 @@
     // serialized form should have properly nested definition list tags
     // enclosing comments, tags and deprecated information.
     private static final String[][] TEST_CMNT_DEPR = {
-        {BUG_ID + "/pkg1/package-summary.html", "<dl>\n" +
+        { "pkg1/package-summary.html", "<dl>\n" +
                  "<dt><span class=\"simpleTagLabel\">Since:</span></dt>\n" +
                  "<dd>JDK1.0</dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"simpleTagLabel\">Since:</span></dt>\n" +
                  "<dd>JDK1.0</dd>\n" +
                  "<dt><span class=\"seeLabel\">See Also:</span></dt>\n" +
@@ -68,7 +66,7 @@
                  "<a href=\"../serialized-form.html#pkg1.C1\">" +
                  "Serialized Form</a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"simpleTagLabel\">Since:</span></dt>\n" +
                  "<dd>1.4</dd>\n" +
                  "<dt><span class=\"seeLabel\">See Also:</span></dt>\n" +
@@ -76,7 +74,7 @@
                  "<a href=\"../pkg1/C1.html#setUndecorated-boolean-\">" +
                  "<code>setUndecorated(boolean)</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
                  "<dt><span class=\"paramLabel\">Parameters:</span></dt>\n" +
                  "<dd><code>title" +
                  "</code> - the title</dd>\n" +
@@ -89,7 +87,7 @@
                  "device</dd>\n" +
                  "<dd><code>HeadlessException</code></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"paramLabel\">Parameters:</span></dt>\n" +
         "<dd><code>undecorated" +
                  "</code> - <code>true</code> if no decorations are\n" +
@@ -104,7 +102,7 @@
                  "<a href=\"../pkg1/C1.html#readObject--\"><code>readObject()" +
                  "</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"throwsLabel\">Throws:</span></dt>\n" +
                  "<dd><code>java.io.IOException</code></dd>\n" +
                  "<dt><span class=\"seeLabel\">See Also:" +
@@ -112,7 +110,7 @@
                  "<dd><a href=\"../pkg1/C1.html#setUndecorated-boolean-\">" +
                  "<code>setUndecorated(boolean)</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C2.html", "<dl>\n" +
+        { "pkg1/C2.html", "<dl>\n" +
         "<dt><span class=\"paramLabel\">Parameters:" +
                  "</span></dt>\n" +
                  "<dd><code>set</code> - boolean</dd>\n" +
@@ -120,7 +118,7 @@
                  "Since:</span></dt>\n" +
                  "<dd>1.4</dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html", "<dl>\n" +
+        { "serialized-form.html", "<dl>\n" +
         "<dt><span class=\"throwsLabel\">Throws:</span>" +
                  "</dt>\n" +
                  "<dd><code>" +
@@ -130,7 +128,7 @@
                  "<dd><a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
                  "<code>C1.setUndecorated(boolean)</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
                  "<span class=\"deprecatedLabel\">Deprecated.</span>" +
                  "&nbsp;<span class=\"deprecationComment\">As of JDK version 1.5, replaced by\n" +
                  " <a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
@@ -146,7 +144,7 @@
                  "<dd><a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
                  "<code>C1.setUndecorated(boolean)</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
                  "<span class=\"deprecatedLabel\">Deprecated.</span>" +
                  "&nbsp;<span class=\"deprecationComment\">As of JDK version 1.5, replaced by\n" +
                  " <a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
@@ -159,7 +157,7 @@
                  "IOException</code></code></dd>\n" +
                  "<dd><code>java.io.IOException</code></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
                  "<span class=\"deprecatedLabel\">Deprecated.</span>" +
                  "&nbsp;</div>\n" +
                  "<div class=\"block\">The name for this class.</div>"}};
@@ -170,11 +168,11 @@
     // should display properly nested definition list tags for comments, tags
     // and deprecated information.
     private static final String[][] TEST_NODEPR = {
-        {BUG_ID + "/pkg1/package-summary.html", "<dl>\n" +
+        { "pkg1/package-summary.html", "<dl>\n" +
                  "<dt><span class=\"simpleTagLabel\">Since:</span></dt>\n" +
                  "<dd>JDK1.0</dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"simpleTagLabel\">Since:</span>" +
                  "</dt>\n" +
                  "<dd>JDK1.0</dd>\n" +
@@ -185,7 +183,7 @@
                  "<a href=\"../serialized-form.html#pkg1.C1\">" +
                  "Serialized Form</a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"paramLabel\">Parameters:" +
                  "</span></dt>\n" +
                  "<dd><code>title</code> - the title</dd>\n" +
@@ -200,7 +198,7 @@
                  "<dd><code>" +
                  "HeadlessException</code></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"paramLabel\">Parameters:" +
                  "</span></dt>\n" +
                  "<dd><code>undecorated</code> - <code>true</code>" +
@@ -214,7 +212,7 @@
                  "<dd><a href=\"../pkg1/C1.html#readObject--\">" +
                  "<code>readObject()</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl>\n" +
         "<dt><span class=\"throwsLabel\">Throws:</span>" +
                  "</dt>\n" +
                  "<dd><code>java.io.IOException</code></dd>\n" +
@@ -223,7 +221,7 @@
                  "<dd><a href=\"../pkg1/C1.html#setUndecorated-boolean-\">" +
                  "<code>setUndecorated(boolean)</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html", "<dl>\n" +
+        { "serialized-form.html", "<dl>\n" +
         "<dt><span class=\"throwsLabel\">Throws:</span>" +
                  "</dt>\n" +
                  "<dd><code>" +
@@ -233,7 +231,7 @@
                  "<dd><a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
                  "<code>C1.setUndecorated(boolean)</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
                  "<span class=\"deprecatedLabel\">Deprecated.</span>" +
                  "&nbsp;<span class=\"deprecationComment\">As of JDK version 1.5, replaced by\n" +
                  " <a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
@@ -249,7 +247,7 @@
                  "<dd><a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
                  "<code>C1.setUndecorated(boolean)</code></a></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
                  "<span class=\"deprecatedLabel\">Deprecated.</span>" +
                  "&nbsp;<span class=\"deprecationComment\">As of JDK version 1.5, replaced by\n" +
                  " <a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
@@ -262,7 +260,7 @@
                  "IOException</code></code></dd>\n" +
                  "<dd><code>java.io.IOException</code></dd>\n" +
                  "</dl>"},
-        {BUG_ID + "/serialized-form.html",
+        { "serialized-form.html",
                  "<span class=\"deprecatedLabel\">Deprecated.</span>" +
                  "&nbsp;</div>\n" +
                  "<div class=\"block\">" +
@@ -271,25 +269,25 @@
     // Test with -nocomment and -nodeprecated options. The ClassDocs whould
     // not display definition lists for any member details.
     private static final String[][] TEST_NOCMNT_NODEPR = {
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
                  "<pre>public&nbsp;void&nbsp;readObject()\n" +
                  "                throws java.io.IOException</pre>\n" +
                  "</li>"},
-        {BUG_ID + "/pkg1/C2.html", "<pre>public&nbsp;C2()</pre>\n" +
+        { "pkg1/C2.html", "<pre>public&nbsp;C2()</pre>\n" +
                  "</li>"},
-        {BUG_ID + "/pkg1/C1.ModalExclusionType.html", "<pre>public " +
+        { "pkg1/C1.ModalExclusionType.html", "<pre>public " +
                  "static final&nbsp;<a href=\"../pkg1/C1.ModalExclusionType.html\" " +
                  "title=\"enum in pkg1\">C1.ModalExclusionType</a> " +
                  "APPLICATION_EXCLUDE</pre>\n" +
                  "</li>"},
-        {BUG_ID + "/serialized-form.html", "<pre>boolean " +
+        { "serialized-form.html", "<pre>boolean " +
                  "undecorated</pre>\n" +
                  "<div class=\"block\"><span class=\"deprecatedLabel\">" +
                  "Deprecated.</span>&nbsp;<span class=\"deprecationComment\">As of JDK version 1.5, replaced by\n" +
                  " <a href=\"pkg1/C1.html#setUndecorated-boolean-\"><code>" +
                  "setUndecorated(boolean)</code></a>.</span></div>\n" +
                  "</li>"},
-        {BUG_ID + "/serialized-form.html", "<span class=\"deprecatedLabel\">" +
+        { "serialized-form.html", "<span class=\"deprecatedLabel\">" +
                  "Deprecated.</span>&nbsp;<span class=\"deprecationComment\">As of JDK version" +
                  " 1.5, replaced by\n" +
                  " <a href=\"pkg1/C1.html#setUndecorated-boolean-\">" +
@@ -299,54 +297,54 @@
     // Test for valid HTML generation which should not comprise of empty
     // definition list tags.
     private static final String[][] NEGATED_TEST = {
-        {BUG_ID + "/pkg1/package-summary.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/package-summary.html", "<dl>\n" +
+        { "pkg1/package-summary.html", "<dl></dl>"},
+        { "pkg1/package-summary.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/C1.html", "<dl>\n" +
+        { "pkg1/C1.html", "<dl></dl>"},
+        { "pkg1/C1.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/pkg1/C1.ModalExclusionType.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/C1.ModalExclusionType.html", "<dl>\n" +
+        { "pkg1/C1.ModalExclusionType.html", "<dl></dl>"},
+        { "pkg1/C1.ModalExclusionType.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/pkg1/C2.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/C2.html", "<dl>\n" +
+        { "pkg1/C2.html", "<dl></dl>"},
+        { "pkg1/C2.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/pkg1/C2.ModalType.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/C2.ModalType.html", "<dl>\n" +
+        { "pkg1/C2.ModalType.html", "<dl></dl>"},
+        { "pkg1/C2.ModalType.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/pkg1/C3.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/C3.html", "<dl>\n" +
+        { "pkg1/C3.html", "<dl></dl>"},
+        { "pkg1/C3.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/pkg1/C4.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/C4.html", "<dl>\n" +
+        { "pkg1/C4.html", "<dl></dl>"},
+        { "pkg1/C4.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/pkg1/C5.html", "<dl></dl>"},
-        {BUG_ID + "/pkg1/C5.html", "<dl>\n" +
+        { "pkg1/C5.html", "<dl></dl>"},
+        { "pkg1/C5.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/overview-tree.html", "<dl></dl>"},
-        {BUG_ID + "/overview-tree.html", "<dl>\n" +
+        { "overview-tree.html", "<dl></dl>"},
+        { "overview-tree.html", "<dl>\n" +
         "</dl>"},
-        {BUG_ID + "/serialized-form.html", "<dl></dl>"},
-        {BUG_ID + "/serialized-form.html", "<dl>\n" +
+        { "serialized-form.html", "<dl></dl>"},
+        { "serialized-form.html", "<dl>\n" +
         "</dl>"}};
 
     private static final String[] ARGS1 =
         new String[] {
-            "-Xdoclint:none", "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"};
+            "-Xdoclint:none", "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1"};
 
     private static final String[] ARGS2 =
         new String[] {
-            "-Xdoclint:none", "-d", BUG_ID, "-nocomment", "-sourcepath",
+            "-Xdoclint:none", "-d", OUTPUT_DIR, "-nocomment", "-sourcepath",
             SRC_DIR, "pkg1"};
 
     private static final String[] ARGS3 =
         new String[] {
-            "-Xdoclint:none", "-d", BUG_ID, "-nodeprecated", "-sourcepath",
+            "-Xdoclint:none", "-d", OUTPUT_DIR, "-nodeprecated", "-sourcepath",
             SRC_DIR, "pkg1"};
 
     private static final String[] ARGS4 =
         new String[] {
-            "-Xdoclint:none", "-d", BUG_ID, "-nocomment", "-nodeprecated",
+            "-Xdoclint:none", "-d", OUTPUT_DIR, "-nocomment", "-nodeprecated",
             "-sourcepath", SRC_DIR, "pkg1"};
 
     /**
@@ -355,28 +353,14 @@
      */
     public static void main(String[] args) {
         TestHtmlDefinitionListTag tester = new TestHtmlDefinitionListTag();
-        run(tester, ARGS1, TEST_ALL, NEGATED_TEST);
-        run(tester, ARGS1, TEST_CMNT_DEPR, NEGATED_TEST);
-        run(tester, ARGS2, TEST_ALL, NEGATED_TEST);
-        run(tester, ARGS2, NO_TEST, TEST_CMNT_DEPR);
-        run(tester, ARGS3, TEST_ALL, NEGATED_TEST);
-        run(tester, ARGS3, TEST_NODEPR, TEST_NOCMNT_NODEPR);
-        run(tester, ARGS4, TEST_ALL, NEGATED_TEST);
-        run(tester, ARGS4, TEST_NOCMNT_NODEPR, TEST_CMNT_DEPR);
+        tester.run(ARGS1, TEST_ALL, NEGATED_TEST);
+        tester.run(ARGS1, TEST_CMNT_DEPR, NEGATED_TEST);
+        tester.run(ARGS2, TEST_ALL, NEGATED_TEST);
+        tester.run(ARGS2, NO_TEST, TEST_CMNT_DEPR);
+        tester.run(ARGS3, TEST_ALL, NEGATED_TEST);
+        tester.run(ARGS3, TEST_NODEPR, TEST_NOCMNT_NODEPR);
+        tester.run(ARGS4, TEST_ALL, NEGATED_TEST);
+        tester.run(ARGS4, TEST_NOCMNT_NODEPR, TEST_CMNT_DEPR);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java	Thu Apr 24 16:04:44 2014 -0700
@@ -36,28 +36,27 @@
 
 public class TestHtmlStrongTag extends JavadocTester {
 
-    private static final String BUG_ID = "6786028";
     private static final String[][] TEST1 = {
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<span class=\"seeLabel\">See Also:</span>"}};
     private static final String[][] NEGATED_TEST1 = {
-        {BUG_ID + "/pkg1/C1.html", "<STRONG>Method Summary</STRONG>"},
-        {BUG_ID + "/pkg1/C1.html", "<B>"},
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/C1.html", "<STRONG>Method Summary</STRONG>"},
+        { "pkg1/C1.html", "<B>"},
+        { "pkg1/package-summary.html",
             "<STRONG>Class Summary</STRONG>"}};
     private static final String[][] TEST2 = {
-        {BUG_ID + "/pkg2/C2.html", "<B>Comments:</B>"}};
+        { "pkg2/C2.html", "<B>Comments:</B>"}};
     private static final String[][] NEGATED_TEST2 = {
-        {BUG_ID + "/pkg2/C2.html", "<STRONG>Method Summary</STRONG>"},
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg2/C2.html", "<STRONG>Method Summary</STRONG>"},
+        { "pkg1/package-summary.html",
             "<STRONG>Class Summary</STRONG>"}};
 
     private static final String[] ARGS1 =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"};
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1"};
     private static final String[] ARGS2 =
         new String[] {
-            "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg2"};
+            "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg2"};
 
     /**
      * The entry point of the test.
@@ -65,22 +64,8 @@
      */
     public static void main(String[] args) {
         TestHtmlStrongTag tester = new TestHtmlStrongTag();
-        run(tester, ARGS1, TEST1, NEGATED_TEST1);
-        run(tester, ARGS2, TEST2, NEGATED_TEST2);
+        tester.run(ARGS1, TEST1, NEGATED_TEST1);
+        tester.run(ARGS2, TEST2, NEGATED_TEST2);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java	Thu Apr 24 16:04:44 2014 -0700
@@ -33,47 +33,45 @@
 
 public class TestHtmlTableStyles extends JavadocTester {
 
-    private static final String BUG_ID = "8008164";
-
     //Input for string search tests.
     private static final String[][] TEST = {
-        {BUG_ID + "/pkg1/TestTable.html",
+        { "pkg1/TestTable.html",
             "<table border cellpadding=3 cellspacing=1>"
         },
-        {BUG_ID + "/pkg1/TestTable.html",
+        { "pkg1/TestTable.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Field Summary table, listing fields, " +
             "and an explanation\">"
         },
-        {BUG_ID + "/pkg1/TestTable.html",
+        { "pkg1/TestTable.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Constructor Summary table, listing " +
             "constructors, and an explanation\">"
         },
-        {BUG_ID + "/pkg1/TestTable.html",
+        { "pkg1/TestTable.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Method Summary table, listing methods, " +
             "and an explanation\">"
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<table class=\"typeSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Class Summary table, listing classes, " +
             "and an explanation\">"
         },
-        {BUG_ID + "/pkg1/class-use/TestTable.html",
+        { "pkg1/class-use/TestTable.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Use table, listing fields, and an explanation\">"
         },
-        {BUG_ID + "/overview-summary.html",
+        { "overview-summary.html",
             "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Packages table, listing packages, and an explanation\">"
         },
-        {BUG_ID + "/deprecated-list.html",
+        { "deprecated-list.html",
             "<table class=\"deprecatedSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Deprecated Methods table, listing " +
             "deprecated methods, and an explanation\">"
         },
-        {BUG_ID + "/constant-values.html",
+        { "constant-values.html",
             "<table class=\"constantsSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Constant Field Values table, listing " +
             "constant fields, and values\">"
@@ -81,7 +79,7 @@
     };
 
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2"
     };
 
     /**
@@ -90,21 +88,7 @@
      */
     public static void main(String[] args) throws Exception {
         TestHtmlTableStyles tester = new TestHtmlTableStyles();
-        run(tester, ARGS, TEST, NO_TEST);
+        tester.run(ARGS, TEST, NO_TEST);
         tester.printSummary();
     }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugId() {
-        return BUG_ID;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getBugName() {
-        return getClass().getName();
-    }
 }
--- a/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java	Thu Apr 24 12:21:18 2014 -0700
+++ b/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java	Thu Apr 24 16:04:44 2014 -0700
@@ -34,12 +34,9 @@
 
 public class TestHtmlTableTags extends JavadocTester {
 
-    //Test information.
-    private static final String BUG_ID = "6786688";
-
     //Javadoc arguments.
     private static final String[] ARGS = new String[] {
-        "-d", BUG_ID, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2"
+        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2"
     };
 
     //Input for string tests for HTML table tags.
@@ -49,127 +46,127 @@
          */
 
         //Package summary
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<table class=\"typeSummary\" border=\"0\" cellpadding=\"3\"" +
             " cellspacing=\"0\" summary=\"Class Summary table, " +
             "listing classes, and an explanation\">"
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<table class=\"typeSummary\" border=\"0\" cellpadding=\"3\"" +
             " cellspacing=\"0\" summary=\"Interface Summary table, " +
             "listing interfaces, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<table class=\"typeSummary\" border=\"0\" cellpadding=\"3\"" +
             " cellspacing=\"0\" summary=\"Enum Summary table, " +
             "listing enums, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<table class=\"typeSummary\" border=\"0\" cellpadding=\"3\"" +
             " cellspacing=\"0\" summary=\"Annotation Types Summary table, " +
             "listing annotation types, and an explanation\">"
         },
         // Class documentation
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Field Summary table, listing fields, " +
             "and an explanation\">"
         },
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Method Summary table, listing methods, " +
             "and an explanation\">"
         },
-        {BUG_ID + "/pkg2/C2.html",
+        { "pkg2/C2.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Nested Class Summary table, listing " +
             "nested classes, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/C2.html",
+        { "pkg2/C2.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Constructor Summary table, listing " +
             "constructors, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/C2.ModalExclusionType.html",
+        { "pkg2/C2.ModalExclusionType.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Enum Constant Summary table, listing " +
             "enum constants, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/C3.html",
+        { "pkg2/C3.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Required Element Summary table, " +
             "listing required elements, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/C4.html",
+        { "pkg2/C4.html",
             "<table class=\"memberSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Optional Element Summary table, " +
             "listing optional elements, and an explanation\">"
         },
         // Class use documentation
-        {BUG_ID + "/pkg1/class-use/I1.html",
+        { "pkg1/class-use/I1.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing packages, and an explanation\">"
         },
-        {BUG_ID + "/pkg1/class-use/C1.html",
+        { "pkg1/class-use/C1.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing fields, and an explanation\">"
         },
-        {BUG_ID + "/pkg1/class-use/C1.html",
+        { "pkg1/class-use/C1.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing methods, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/class-use/C2.html",
+        { "pkg2/class-use/C2.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing fields, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/class-use/C2.html",
+        { "pkg2/class-use/C2.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing methods, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/class-use/C2.ModalExclusionType.html",
+        { "pkg2/class-use/C2.ModalExclusionType.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing packages, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/class-use/C2.ModalExclusionType.html",
+        { "pkg2/class-use/C2.ModalExclusionType.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing methods, and an explanation\">"
         },
         // Package use documentation
-        {BUG_ID + "/pkg1/package-use.html",
+        { "pkg1/package-use.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing packages, and an explanation\">"
         },
-        {BUG_ID + "/pkg1/package-use.html",
+        { "pkg1/package-use.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing classes, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/package-use.html",
+        { "pkg2/package-use.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing packages, and an explanation\">"
         },
-        {BUG_ID + "/pkg2/package-use.html",
+        { "pkg2/package-use.html",
             "<table class=\"useSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " +
             "table, listing classes, and an explanation\">"
         },
         // Deprecated
-        {BUG_ID + "/deprecated-list.html",
+        { "deprecated-list.html",
             "<table class=\"deprecatedSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" " +
             "summary=\"Deprecated Fields table, listing deprecated fields, " +
             "and an explanation\">"
         },
-        {BUG_ID + "/deprecated-list.html",
+        { "deprecated-list.html",
             "<table class=\"deprecatedSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" " +
             "summary=\"Deprecated Methods table, listing deprecated methods, " +
             "and an explanation\">"
         },
         // Constant values
-        {BUG_ID + "/constant-values.html",
+        { "constant-values.html",
             "<table class=\"constantsSummary\" border=\"0\" cellpadding=\"3\" cellspacing=\"0\" " +
             "summary=\"Constant Field Values table, listing " +
             "constant fields, and values\">"
         },
         // Overview Summary
-        {BUG_ID + "/overview-summary.html",
+        { "overview-summary.html",
             "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " +
             "cellspacing=\"0\" summary=\"Packages table, " +
             "listing packages, and an explanation\">"
@@ -180,27 +177,27 @@
          */
 
         //Package summary
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<caption><span>Class Summary</span><span class=\"tabEnd\">" +
             "&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg1/package-summary.html",
+        { "pkg1/package-summary.html",
             "<caption><span>Interface Summary</span><span class=\"tabEnd\">" +
             "&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<caption><span>Enum Summary</span><span class=\"tabEnd\">" +
             "&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg2/package-summary.html",
+        { "pkg2/package-summary.html",
             "<caption><span>Annotation Types Summary</span><span class=\"tabEnd\">" +
             "&nbsp;</span></caption>"
         },
         // Class documentation
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<caption><span>Fields</span><span class=\"tabEnd\">&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg1/C1.html",
+        { "pkg1/C1.html",
             "<caption><span id=\"t0\" class=\"activeTableTab\"><span>All " +
             "Methods</span><span class=\"tabEnd\">&nbsp;</span></span>" +
             "<span id=\"t2\" class=\"tableTab\"><span><a href=\"javascript:show(2);\">" +
@@ -211,94 +208,94 @@
             "Deprecated Methods</a></span><span class=\"tabEnd\">&nbsp;</span></span>" +
             "</caption>"
         },
-        {BUG_ID + "/pkg2/C2.html",
+        { "pkg2/C2.html",
             "<caption><span>Nested Classes</span><span class=\"tabEnd\">&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg2/C2.html",
+        { "pkg2/C2.html",
             "<caption><span>Constructors</span><span class=\"tabEnd\">&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg2/C2.ModalExclusionType.html",
+        { "pkg2/C2.ModalExclusionType.html",
             "<caption><span>Enum Constants</span><span class=\"tabEnd\">&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg2/C3.html",
+        { "pkg2/C3.html",
             "<caption><span>Required Elements</span><span class=\"tabEnd\">&nbsp;" +
             "</span></caption>"
         },
-        {BUG_ID + "/pkg2/C4.html",
+        { "pkg2/C4.html",
             "<caption><span>Optional Elements</span><span class=\"tabEnd\">&nbsp;" +
             "</span></caption>"
         },
         // Class use documentation
-        {BUG_ID + "/pkg1/class-use/I1.html",
+        { "pkg1/class-use/I1.html",
             "<caption><span>Packages that use <a href=\"../../pkg1/I1.html\" " +
             "title=\"interface in pkg1\">I1</a></span><span class=\"tabEnd\">" +
             "&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg1/class-use/C1.html",
+        { "pkg1/class-use/C1.html",
             "<caption><span>Fields in <a href=\"../../pkg2/package-summary.html\">" +
             "pkg2</a> declared as <a href=\"../../pkg1/C1.html\" " +
             "title=\"class in pkg1\">C1</a></span><span class=\"tabEnd\">&nbsp;" +
             "</span></caption>"
         },
-        {BUG_ID + "/pkg1/class-use/C1.html",
+        { "pkg1/class-use/C1.html",
             "<caption><span>Methods in <a href=\"../../pkg2/package-summary.html\">" +
             "pkg2</a> that return <a href=\"../../pkg1/C1.html\" " +
             "title=\"class in pkg1\">C1</a></span><span class=\"tabEnd\">" +
             "&nbsp;</span></caption>"
         },
-        {BUG_ID + "/pkg2/class-use/C2.html",