changeset 4119:7d89c9c5d41f

Merge
author lana
date Fri, 21 Apr 2017 03:34:47 +0000
parents 2bd173891dcf 9be30ec2401e
children e5707ba051dc
files test/jdk/jshell/MergedTabShiftTabTest.java
diffstat 28 files changed, 809 insertions(+), 471 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.compiler/share/classes/javax/annotation/processing/Processor.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/java.compiler/share/classes/javax/annotation/processing/Processor.java	Fri Apr 21 03:34:47 2017 +0000
@@ -278,14 +278,14 @@
      * <dd><code>*</code>
      *
      * <dt><i>ModulePrefix:</i>
-     * <dd><i>TypeName</i> <code>/</code>
+     * <dd><i>ModuleName</i> <code>/</code>
      *
      * <dt><i>DotStar:</i>
      * <dd><code>.</code> <code>*</code>
      * </dl>
      * </blockquote>
      *
-     * where <i>TypeName</i> is as defined in
+     * where <i>TypeName</i> and <i>ModuleName</i> are as defined in
      * <cite>The Java&trade; Language Specification</cite>.
      *
      * @apiNote When running in an environment which supports modules,
@@ -299,7 +299,7 @@
      * @return the names of the annotation types supported by this processor
      * @see javax.annotation.processing.SupportedAnnotationTypes
      * @jls 3.8 Identifiers
-     * @jls 6.5.5 Meaning of Type Names
+     * @jls 6.5 Determining the Meaning of a Name
      */
     Set<String> getSupportedAnnotationTypes();
 
--- a/src/java.compiler/share/classes/javax/lang/model/element/ModuleElement.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/java.compiler/share/classes/javax/lang/model/element/ModuleElement.java	Fri Apr 21 03:34:47 2017 +0000
@@ -28,13 +28,14 @@
 import java.util.List;
 
 /**
- * Represents a module program element.  Provides access to information
- * about the module and its members.
+ * Represents a module program element.  Provides access to
+ * information about the module, its directives, and its members.
  *
  * @see javax.lang.model.util.Elements#getModuleOf
  * @since 9
+ * @jls 7.7 Module Declarations
  * @spec JPMS
- */  // TODO: add @jls to module section
+ */
 public interface ModuleElement extends Element, QualifiedNameable {
 
     /**
@@ -121,12 +122,13 @@
     };
 
     /**
-     * Represents a "module statement" within the declaration of this module.
+     * Represents a directive within the declaration of this
+     * module. The directives of a module declaration configure the
+     * module in the Java Platform Module System.
      *
      * @since 9
      * @spec JPMS
-     *
-     */ // TODO: add jls to Module Statement
+     */
     interface Directive {
         /**
          * Returns the {@code kind} of this directive.
--- a/src/jdk.compiler/share/classes/com/sun/source/doctree/package-info.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.compiler/share/classes/com/sun/source/doctree/package-info.java	Fri Apr 21 03:34:47 2017 +0000
@@ -29,6 +29,6 @@
  *
  * @author Jonathan Gibbons
  * @since 1.8
- * @see <a href="http://download.oracle.com/javase/6/docs/technotes/tools/solaris/javadoc.html#javadoctags">http://download.oracle.com/javase/6/docs/technotes/tools/solaris/javadoc.html#javadoctags</a>
+ * @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/unix/javadoc.html#CHDJGIJB">http://docs.oracle.com/javase/8/docs/technotes/tools/unix/javadoc.html#CHDJGIJB</a>
  */
 package com.sun.source.doctree;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java	Fri Apr 21 03:34:47 2017 +0000
@@ -194,7 +194,13 @@
 
         lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option);
 
-        legacyModuleOverride = options.get(Option.XMODULE);
+        Collection<String> xmodules = options.keySet()
+                                             .stream()
+                                             .filter(opt -> opt.startsWith(XMODULES_PREFIX))
+                                             .map(opt -> opt.substring(XMODULES_PREFIX.length()))
+                                             .collect(Collectors.toList());
+
+        legacyModuleOverride = xmodules.size() == 1 ? xmodules.iterator().next() : null;
 
         multiModuleMode = fileManager.hasLocation(StandardLocation.MODULE_SOURCE_PATH);
         ClassWriter classWriter = ClassWriter.instance(context);
@@ -211,6 +217,8 @@
         limitModsOpt = options.get(Option.LIMIT_MODULES);
         moduleVersionOpt = options.get(Option.MODULE_VERSION);
     }
+    //where
+        private static final String XMODULES_PREFIX = "-Xmodule:";
 
     int depth = -1;
     private void dprintln(String msg) {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Fri Apr 21 03:34:47 2017 +0000
@@ -603,17 +603,6 @@
         }
     },
 
-    XMODULE("-Xmodule:", "opt.arg.module", "opt.module", HIDDEN, BASIC) {
-        @Override
-        public void process(OptionHelper helper, String option, String arg) throws InvalidValueException {
-            String prev = helper.get(XMODULE);
-            if (prev != null) {
-                throw helper.newInvalidValueException("err.option.too.many", XMODULE.primaryName);
-            }
-            helper.put(XMODULE.primaryName, arg);
-        }
-    },
-
     MODULE("--module -m", "opt.arg.m", "opt.m", STANDARD, BASIC),
 
     ADD_MODULES("--add-modules", "opt.arg.addmods", "opt.addmods", STANDARD, BASIC) {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/DocCommentParser.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/DocCommentParser.java	Fri Apr 21 03:34:47 2017 +0000
@@ -1012,7 +1012,7 @@
     }
 
     /**
-     * @see <a href="http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javadoc.html#javadoctags">Javadoc Tags</a>
+     * @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/unix/javadoc.html#CHDJGIJB">Javadoc Tags</a>
      */
     private void initTagParsers() {
         TagParser[] parsers = {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties	Fri Apr 21 03:34:47 2017 +0000
@@ -312,10 +312,6 @@
     in JAR files or directories
 javac.opt.arg.patch=\
     <module>=<file>(:<file>)*
-javac.opt.module=\
-    Specify a module to which the classes being compiled belong.
-javac.opt.arg.module=\
-    <module>
 javac.opt.addmods=\
     Root modules to resolve in addition to the initial modules, or all modules\n\
     on the module path if <module> is ALL-MODULE-PATH.
--- a/src/jdk.javadoc/share/classes/com/sun/tools/doclets/Taglet.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.javadoc/share/classes/com/sun/tools/doclets/Taglet.java	Fri Apr 21 03:34:47 2017 +0000
@@ -53,14 +53,14 @@
  * <p>
  * Here are two sample taglets: <br>
  * <ul>
- *  <li><a href="{@docRoot}/../../../../technotes/guides/javadoc/taglet/ToDoTaglet.java">ToDoTaglet.java</a>
+ *  <li><a href="http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/taglet/ToDoTaglet.java">ToDoTaglet.java</a>
  *         - Standalone taglet</li>
- *  <li><a href="{@docRoot}/../../../../technotes/guides/javadoc/taglet/UnderlineTaglet.java">UnderlineTaglet.java</a>
+ *  <li><a href="http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/taglet/UnderlineTaglet.java">UnderlineTaglet.java</a>
  *         - Inline taglet</li>
  * </ul>
  * <p>
  * For more information on how to create your own Taglets, please see the
- * <a href="{@docRoot}/../../../../technotes/guides/javadoc/taglet/overview.html">Taglet Overview</a>.
+ * <a href="http://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/taglet/overview.html">Taglet Overview</a>.
  *
  * @since 1.4
  * @author Jamie Ho
--- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavaScriptScanner.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavaScriptScanner.java	Fri Apr 21 03:34:47 2017 +0000
@@ -788,7 +788,7 @@
     }
 
     /**
-     * @see <a href="http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javadoc.html#javadoctags">Javadoc Tags</a>
+     * @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/unix/javadoc.html#CHDJGIJB">Javadoc Tags</a>
      */
     @SuppressWarnings("deprecation")
     private void initTagParsers() {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java	Fri Apr 21 03:34:47 2017 +0000
@@ -336,26 +336,32 @@
         // Get all the exported and opened packages, for the transitive closure of the module, to be displayed in
         // the indirect packages tables.
         dependentModules.forEach((module, mod) -> {
-            SortedSet<PackageElement> pkgList = new TreeSet<>(utils.makePackageComparator());
+            SortedSet<PackageElement> exportPkgList = new TreeSet<>(utils.makePackageComparator());
             (ElementFilter.exportsIn(module.getDirectives())).forEach((directive) -> {
                 PackageElement pkg = directive.getPackage();
                 if (shouldDocument(pkg)) {
-                    pkgList.add(pkg);
+                    // Qualified exports are not displayed in API mode
+                    if (moduleMode == ModuleMode.ALL || directive.getTargetModules() == null) {
+                        exportPkgList.add(pkg);
+                    }
                 }
             });
-            // If none of the transitive modules have exported packages to be displayed, we should not be
+            // If none of the indirect modules have exported packages to be displayed, we should not be
             // displaying the table and so it should not be added to the map.
-            if (!pkgList.isEmpty()) {
-                indirectPackages.put(module, pkgList);
+            if (!exportPkgList.isEmpty()) {
+                indirectPackages.put(module, exportPkgList);
             }
             SortedSet<PackageElement> openPkgList = new TreeSet<>(utils.makePackageComparator());
             (ElementFilter.opensIn(module.getDirectives())).forEach((directive) -> {
                 PackageElement pkg = directive.getPackage();
                 if (shouldDocument(pkg)) {
-                    openPkgList.add(pkg);
+                    // Qualified opens are not displayed in API mode
+                    if (moduleMode == ModuleMode.ALL || directive.getTargetModules() == null) {
+                        openPkgList.add(pkg);
+                    }
                 }
             });
-            // If none of the transitive modules have opened packages to be displayed, we should not be
+            // If none of the indirect modules have opened packages to be displayed, we should not be
             // displaying the table and so it should not be added to the map.
             if (!openPkgList.isEmpty()) {
                 indirectOpenPackages.put(module, openPkgList);
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties	Fri Apr 21 03:34:47 2017 +0000
@@ -332,6 +332,9 @@
 doclet.usage.charset.description=\
     Charset for cross-platform viewing of generated documentation
 
+doclet.usage.javafx.description=\
+    Enable javafx functionality
+
 doclet.usage.helpfile.parameters=\
     <file>
 doclet.usage.helpfile.description=\
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java	Fri Apr 21 03:34:47 2017 +0000
@@ -523,7 +523,7 @@
                     return true;
                 }
             },
-            new Hidden(resources, "-javafx") {
+            new Option(resources, "--javafx -javafx") {
                 @Override
                 public boolean process(String opt, List<String> args) {
                     javafx = true;
@@ -1082,11 +1082,14 @@
         private final int argCount;
 
         protected Option(Resources resources, String name, int argCount) {
-            this(resources, "doclet.usage." + name.toLowerCase().replaceAll("^-+", ""), name, argCount);
+            this(resources, null, name, argCount);
         }
 
         protected Option(Resources resources, String keyBase, String name, int argCount) {
             this.names = name.trim().split("\\s+");
+            if (keyBase == null) {
+                keyBase = "doclet.usage." + names[0].toLowerCase().replaceAll("^-+", "");
+            }
             String desc = getOptionsMessage(resources, keyBase + ".description");
             if (desc.isEmpty()) {
                 this.description = "<MISSING KEY>";
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css	Thu Apr 20 18:14:07 2017 +0000
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css	Fri Apr 21 03:34:47 2017 +0000
@@ -27,21 +27,13 @@
     text-decoration:none;
     color:#4A6782;
 }
-a:hover, a:focus {
+a[href]:hover, a[href]:focus {
     text-decoration:none;
     color:#bb7a2a;
 }
-a:active {
-    text-decoration:none;
-    color:#4A6782;
-}
 a[name] {
     color:#353833;
 }
-a[name]:hover {
-    text-decoration:none;
-    color:#353833;
-}
 a[name]:before, a[name]:target, a[id]:before, a[id]:target {
     content:"";
     display:inline-block;
@@ -579,15 +571,13 @@
 .packagesSummary th.colLast, .packagesSummary td.colLast {
     white-space:normal;
 }
-td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover,
-td.colSecond a:link, td.colSecond a:active, td.colSecond a:visited, td.colSecond a:hover,
-th.colFirst a:link, th.colFirst a:active, th.colFirst a:visited, th.colFirst a:hover,
-th.colSecond a:link, th.colSecond a:active, th.colSecond a:visited, th.colSecond a:hover,
-th.colConstructorName a:link, th.colConstructorName a:active, th.colConstructorName a:visited,
-th.colConstructorName a:hover,
-td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover,
-.constantValuesContainer td a:link, .constantValuesContainer td a:active,
-.constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
+td.colFirst a:link, td.colFirst a:visited,
+td.colSecond a:link, td.colSecond a:visited,
+th.colFirst a:link, th.colFirst a:visited,
+th.colSecond a:link, th.colSecond a:visited,
+th.colConstructorName a:link, th.colConstructorName a:visited,
+td.colLast a:link, td.colLast a:visited,
+.constantValuesContainer td a:link, .constantValuesContainer td a:visited {
     font-weight:bold;
 }
 .tableSubHeadingColor {
--- a/test/TEST.ROOT	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/TEST.ROOT	Fri Apr 21 03:34:47 2017 +0000
@@ -19,3 +19,6 @@
 
 # Use new module options
 useNewOptions=true
+
+# Use --patch-module instead of -Xmodule:
+useNewPatchModule=true
--- a/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java	Fri Apr 21 03:34:47 2017 +0000
@@ -23,7 +23,8 @@
 
 /*
  * @test
- * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363 8167967 8172528 8175200
+ * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363
+ *      8167967 8172528 8175200 8178830
  * @summary Test of the JavaFX doclet features.
  * @author jvalenta
  * @library ../lib
@@ -265,12 +266,13 @@
 
     /*
      * Force the doclet to emit a warning when processing a synthesized,
-     * DocComment, and ensure that the run succeeds.
+     * DocComment, and ensure that the run succeeds, using the newer
+     * --javafx flag.
      */
     @Test
     void test4() {
         javadoc("-d", "out4",
-                "-javafx",
+                "--javafx",
                 "-Xdoclint:none",
                 "-sourcepath", testSrc,
                 "-package",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javadoc/doclet/testModules/TestIndirectExportsOpens.java	Fri Apr 21 03:34:47 2017 +0000
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8178339
+ * @summary Tests indirect exports and opens in the module summary page
+ * @modules jdk.javadoc/jdk.javadoc.internal.api
+ *          jdk.javadoc/jdk.javadoc.internal.tool
+ *          jdk.compiler/com.sun.tools.javac.api
+ *          jdk.compiler/com.sun.tools.javac.main
+ * @library ../lib /tools/lib
+ * @build toolbox.ToolBox toolbox.ModuleBuilder JavadocTester
+ * @run main TestIndirectExportsOpens
+ */
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import toolbox.*;
+
+public class TestIndirectExportsOpens extends JavadocTester {
+
+    public final ToolBox tb;
+    public static void main(String... args) throws Exception {
+        TestIndirectExportsOpens tester = new TestIndirectExportsOpens();
+        tester.runTests(m -> new Object[] { Paths.get(m.getName()) });
+    }
+
+    public TestIndirectExportsOpens() {
+        tb = new ToolBox();
+    }
+
+    @Test
+    public void checkNoIndirects(Path base) throws Exception {
+
+        ModuleBuilder mb0 = new ModuleBuilder(tb, "m")
+                .classes("package pm; public class A {}");
+        Path p0 = mb0.write(base);
+
+        ModuleBuilder mb1 = new ModuleBuilder(tb, "a")
+                .requiresTransitive("m", p0)
+                .classes("package pa; public class NoOp {}")
+                .exports("pa");
+        mb1.write(base);
+
+        javadoc("-d", base.resolve("out-api").toString(),
+                "-quiet",
+                "--module-source-path", base.toString(),
+                "--expand-requires", "transitive",
+                "--module", "a");
+        checkExit(Exit.OK);
+        verifyIndirectExports(false);
+        verifyIndirectOpens(false);
+    }
+
+    @Test
+    public void checkExportsOpens(Path base) throws Exception {
+
+        ModuleBuilder mb0 = new ModuleBuilder(tb, "m")
+                .classes("package pm; public class A {}")
+                .exports("pm")
+                .opens("pm");
+
+        Path p0 = mb0.write(base);
+
+        ModuleBuilder mb1 = new ModuleBuilder(tb, "a")
+                .requiresTransitive("m", p0)
+                .classes("package pa ; public class NoOp {}")
+                .exports("pa");
+        mb1.write(base);
+
+        javadoc("-d", base.resolve("out-api").toString(),
+                "-quiet",
+                "--module-source-path", base.toString(),
+                "--expand-requires", "transitive",
+                "--module", "a");
+        checkExit(Exit.OK);
+        verifyIndirectExports(true);
+        verifyIndirectOpens(true);
+    }
+
+    @Test
+    public void checkExportsToOpensTo(Path base) throws Exception {
+
+        ModuleBuilder mb0 = new ModuleBuilder(tb, "m")
+                .classes("package pm; public class A {}")
+                .exportsTo("pm", "x")
+                .opensTo("pm", "x");
+
+        Path p0 = mb0.write(base);
+
+        ModuleBuilder mb1 = new ModuleBuilder(tb, "a")
+                .requiresTransitive("m", p0)
+                .classes("package pa ; public class NoOp {}")
+                .exports("pa");
+        mb1.write(base);
+
+        javadoc("-d", base.resolve("out-api").toString(),
+                "-quiet",
+                "--module-source-path", base.toString(),
+                "--expand-requires", "transitive",
+                "--module", "a");
+
+        checkExit(Exit.OK);
+        verifyIndirectExports(false);
+        verifyIndirectOpens(false);
+    }
+
+    @Test
+    public void checkExportsToOpensToDetailMode(Path base) throws Exception {
+
+        ModuleBuilder mb0 = new ModuleBuilder(tb, "m")
+                .classes("package exportsto; public class A {}")
+                .classes("package opensto; public class A {}")
+                .exportsTo("exportsto", "x")
+                .opensTo("opensto", "x");
+
+        Path p0 = mb0.write(base);
+
+        ModuleBuilder mb1 = new ModuleBuilder(tb, "a")
+                .requiresTransitive("m", p0)
+                .classes("package pa ; public class NoOp {}")
+                .exports("pa");
+        mb1.write(base);
+
+        javadoc("-d", base.resolve("out-detail").toString(),
+                "-quiet",
+                "--module-source-path", base.toString(),
+                "--expand-requires", "transitive",
+                "--show-module-contents", "all",
+                "--module", "a");
+
+        checkExit(Exit.OK);
+
+        // In details mode all kinds of packages from java.base,
+        // could be listed in the indirects section, so just
+        // check for minimal expected strings.
+        checkOutput("a-summary.html", true,
+                "Indirect Exports table",
+                "<th class=\"colFirst\" scope=\"row\"><a href=\"m-summary.html\">m</a></th>\n"
+                + "<td class=\"colLast\"><a href=\"exportsto/package-summary.html\">exportsto</a></td>\n"
+                + "</tr>\n");
+
+        checkOutput("a-summary.html", true,
+                "Indirect Opens table",
+                "<th class=\"colFirst\" scope=\"row\"><a href=\"m-summary.html\">m</a></th>\n"
+                + "<td class=\"colLast\">opensto</td>\n"
+                + "</tr>\n");
+    }
+
+    void verifyIndirectExports(boolean present) {
+        verifyIndirects(present, false);
+    }
+
+    void verifyIndirectOpens(boolean present) {
+        verifyIndirects(present, true);
+    }
+
+    void verifyIndirects(boolean present, boolean opens) {
+
+        String typeString = opens ? "Indirect Opens" : "Indirect Exports";
+
+        // Avoid false positives, just check for primary string absence.
+        if (!present) {
+            checkOutput("a-summary.html", false, typeString);
+            return;
+        }
+
+        checkOutput("a-summary.html", present,
+                "<table class=\"packagesSummary\" summary=\"" + typeString + " table, listing modules, and packages\">\n"
+                + "<caption><span>" + typeString + "</span><span class=\"tabEnd\">&nbsp;</span></caption>\n"
+                + "<tr>\n"
+                + "<th class=\"colFirst\" scope=\"col\">From</th>\n"
+                + "<th class=\"colLast\" scope=\"col\">Packages</th>\n"
+                + "</tr>\n"
+                + "<tbody>\n"
+                + "<tr class=\"altColor\">\n"
+                + "<th class=\"colFirst\" scope=\"row\"><a href=\"m-summary.html\">m</a></th>\n"
+                + "<td class=\"colLast\"><a href=\"pm/package-summary.html\">pm</a></td>\n"
+                + "</tr>\n"
+                + "</tbody>\n"
+                + "</table>\n");
+    }
+
+}
+
--- a/test/jdk/javadoc/doclet/testModules/TestModules.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/jdk/javadoc/doclet/testModules/TestModules.java	Fri Apr 21 03:34:47 2017 +0000
@@ -752,14 +752,6 @@
         checkOutput("moduleA-summary.html", true,
                 "<li><a href=\"#module.description\">Description</a>&nbsp;|&nbsp;<a href=\"#modules.summary\">"
                 + "Modules</a>&nbsp;|&nbsp;<a href=\"#packages.summary\">Packages</a>&nbsp;|&nbsp;Services</li>",
-                "<table class=\"packagesSummary\" summary=\"Indirect Exports table, listing modules, and packages\">\n"
-                + "<caption><span>Indirect Exports</span><span class=\"tabEnd\">&nbsp;</span></caption>",
-                "<table class=\"packagesSummary\" summary=\"Indirect Opens table, listing modules, and packages\">\n"
-                + "<caption><span>Indirect Opens</span><span class=\"tabEnd\">&nbsp;</span></caption>\n"
-                + "<tr>\n"
-                + "<th class=\"colFirst\" scope=\"col\">From</th>\n"
-                + "<th class=\"colLast\" scope=\"col\">Packages</th>\n"
-                + "</tr>\n",
                 "<th class=\"colFirst\" scope=\"row\"><a href=\"moduleB-summary.html\">moduleB</a></th>\n"
                 + "<td class=\"colLast\"><a href=\"testpkgmdlB/package-summary.html\">testpkgmdlB</a></td>\n");
         checkOutput("moduleB-summary.html", true,
--- a/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java	Fri Apr 21 03:34:47 2017 +0000
@@ -24,7 +24,7 @@
 /*
  * @test
  * @bug      4494033 7028815 7052425 8007338 8023608 8008164 8016549 8072461 8154261 8162363 8160196 8151743 8177417
- *           8175218
+ *           8175218 8176452
  * @summary  Run tests on doclet stylesheet.
  * @author   jamieh
  * @library  ../lib
@@ -173,13 +173,36 @@
                 + "}\n"
                 + ".searchTagResult:before, .searchTagResult:target {\n"
                 + "    color:red;\n"
+                + "}",
+                "a[href]:hover, a[href]:focus {\n"
+                + "    text-decoration:none;\n"
+                + "    color:#bb7a2a;\n"
+                + "}",
+                "td.colFirst a:link, td.colFirst a:visited,\n"
+                + "td.colSecond a:link, td.colSecond a:visited,\n"
+                + "th.colFirst a:link, th.colFirst a:visited,\n"
+                + "th.colSecond a:link, th.colSecond a:visited,\n"
+                + "th.colConstructorName a:link, th.colConstructorName a:visited,\n"
+                + "td.colLast a:link, td.colLast a:visited,\n"
+                + ".constantValuesContainer td a:link, .constantValuesContainer td a:visited {\n"
+                + "    font-weight:bold;\n"
                 + "}");
 
-        // Test whether a link to the stylesheet file is inserted properly
-        // in the class documentation.
         checkOutput("pkg/A.html", true,
+                // Test whether a link to the stylesheet file is inserted properly
+                // in the class documentation.
                 "<link rel=\"stylesheet\" type=\"text/css\" "
-                + "href=\"../stylesheet.css\" title=\"Style\">");
+                + "href=\"../stylesheet.css\" title=\"Style\">",
+                "<div class=\"block\">Test comment for a class which has an <a name=\"named_anchor\">"
+                + "anchor_with_name</a> and\n"
+                + " an <a id=\"named_anchor1\">anchor_with_id</a>.</div>");
+
+        checkOutput("pkg/package-summary.html", true,
+                "<td class=\"colLast\">\n"
+                + "<div class=\"block\">Test comment for a class which has an <a name=\"named_anchor\">"
+                + "anchor_with_name</a> and\n"
+                + " an <a id=\"named_anchor1\">anchor_with_id</a>.</div>\n"
+                + "</td>");
 
         checkOutput("index.html", true,
                 "<link rel=\"stylesheet\" type=\"text/css\" href=\"stylesheet.css\" title=\"Style\">");
@@ -188,6 +211,14 @@
                 "* {\n"
                 + "    margin:0;\n"
                 + "    padding:0;\n"
+                + "}",
+                "a:active {\n"
+                + "    text-decoration:none;\n"
+                + "    color:#4A6782;\n"
+                + "}",
+                "a[name]:hover {\n"
+                + "    text-decoration:none;\n"
+                + "    color:#353833;\n"
                 + "}");
     }
 }
--- a/test/jdk/javadoc/doclet/testStylesheet/pkg/A.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/jdk/javadoc/doclet/testStylesheet/pkg/A.java	Fri Apr 21 03:34:47 2017 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017 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
@@ -23,4 +23,8 @@
 
 package pkg;
 
+/**
+ * Test comment for a class which has an <a name="named_anchor">anchor_with_name</a> and
+ * an <a id="named_anchor1">anchor_with_id</a>.
+ */
 public class A {}
--- a/test/jdk/jshell/CompletionSuggestionTest.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/jdk/jshell/CompletionSuggestionTest.java	Fri Apr 21 03:34:47 2017 +0000
@@ -296,7 +296,7 @@
     }
 
     public void testImportStart() {
-        assertCompletion("import c|", "com");
+        assertCompletionIncludesExcludes("import c|", Set.of("com"), Set.of());
     }
 
     public void testBrokenClassFile() throws Exception {
--- a/test/jdk/jshell/HistoryUITest.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/jdk/jshell/HistoryUITest.java	Fri Apr 21 03:34:47 2017 +0000
@@ -28,6 +28,7 @@
  * @modules
  *     jdk.compiler/com.sun.tools.javac.api
  *     jdk.compiler/com.sun.tools.javac.main
+ *     jdk.jshell/jdk.internal.jshell.tool.resources:open
  *     jdk.jshell/jdk.jshell:open
  * @library /tools/lib
  * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jshell/MergedTabShiftTabCommandTest.java	Fri Apr 21 03:34:47 2017 +0000
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8177076
+ * @modules
+ *     jdk.compiler/com.sun.tools.javac.api
+ *     jdk.compiler/com.sun.tools.javac.main
+ *     jdk.jshell/jdk.internal.jshell.tool.resources:open
+ *     jdk.jshell/jdk.jshell:open
+ * @library /tools/lib
+ * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
+ * @build Compiler UITesting
+ * @build MergedTabShiftTabCommandTest
+ * @run testng MergedTabShiftTabCommandTest
+ */
+
+import java.util.regex.Pattern;
+
+import org.testng.annotations.Test;
+
+@Test
+public class MergedTabShiftTabCommandTest extends UITesting {
+
+    public void testCommand() throws Exception {
+        doRunTest((inputSink, out) -> {
+            inputSink.write("1\n");
+            waitOutput(out, "\u0005");
+            inputSink.write("/\011");
+            waitOutput(out, ".*/edit.*/list.*\n\n" + Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n\r\u0005/");
+            inputSink.write("\011");
+            waitOutput(out,   ".*\n/edit\n" + Pattern.quote(getResource("help.edit.summary")) +
+                            "\n.*\n/list\n" + Pattern.quote(getResource("help.list.summary")) +
+                            ".*\n\n" + Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/");
+            inputSink.write("\011");
+            waitOutput(out,  "/!\n" +
+                            Pattern.quote(getResource("help.bang")) + "\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.next.command.doc")) + "\n" +
+                            "\r\u0005/");
+            inputSink.write("\011");
+            waitOutput(out,  "/-<n>\n" +
+                            Pattern.quote(getResource("help.previous")) + "\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.next.command.doc")) + "\n" +
+                            "\r\u0005/");
+
+            inputSink.write("lis\011");
+            waitOutput(out, "list $");
+
+            inputSink.write("\011");
+            waitOutput(out, ".*-all.*" +
+                            "\n\n" + Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n\r\u0005/");
+            inputSink.write("\011");
+            waitOutput(out, Pattern.quote(getResource("help.list.summary")) + "\n\n" +
+                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/list ");
+            inputSink.write("\011");
+            waitOutput(out, Pattern.quote(getResource("help.list").replaceAll("\t", "    ")));
+
+            inputSink.write("\u0003/env \011");
+            waitOutput(out, "\u0005/env -\n" +
+                            "-add-exports    -add-modules    -class-path     -module-path    \n" +
+                            "\r\u0005/env -");
+
+            inputSink.write("\011");
+            waitOutput(out, "-add-exports    -add-modules    -class-path     -module-path    \n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n" +
+                            "\r\u0005/env -");
+
+            inputSink.write("\011");
+            waitOutput(out, Pattern.quote(getResource("help.env.summary")) + "\n\n" +
+                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n" +
+                            "\r\u0005/env -");
+
+            inputSink.write("\011");
+            waitOutput(out, Pattern.quote(getResource("help.env").replaceAll("\t", "    ")) + "\n" +
+                            "\r\u0005/env -");
+
+            inputSink.write("\011");
+            waitOutput(out, "-add-exports    -add-modules    -class-path     -module-path    \n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n" +
+                            "\r\u0005/env -");
+
+            inputSink.write("\u0003/exit \011");
+            waitOutput(out, Pattern.quote(getResource("help.exit.summary")) + "\n\n" +
+                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/exit ");
+            inputSink.write("\011");
+            waitOutput(out, Pattern.quote(getResource("help.exit")) + "\n" +
+                            "\r\u0005/exit ");
+            inputSink.write("\011");
+            waitOutput(out, Pattern.quote(getResource("help.exit.summary")) + "\n\n" +
+                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/exit ");
+            inputSink.write("\u0003/doesnotexist\011");
+            waitOutput(out, "\u0005/doesnotexist\n" +
+                            Pattern.quote(getResource("jshell.console.no.such.command")) + "\n" +
+                            "\n" +
+                            "\r\u0005/doesnotexist");
+        });
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jshell/MergedTabShiftTabExpressionTest.java	Fri Apr 21 03:34:47 2017 +0000
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8177076
+ * @modules
+ *     jdk.compiler/com.sun.tools.javac.api
+ *     jdk.compiler/com.sun.tools.javac.main
+ *     jdk.jshell/jdk.internal.jshell.tool.resources:open
+ *     jdk.jshell/jdk.jshell:open
+ * @library /tools/lib
+ * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
+ * @build Compiler UITesting
+ * @build MergedTabShiftTabExpressionTest
+ * @run testng/timeout=300 MergedTabShiftTabExpressionTest
+ */
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.regex.Pattern;
+
+import org.testng.annotations.Test;
+
+@Test
+public class MergedTabShiftTabExpressionTest extends UITesting {
+
+    public void testExpression() throws Exception {
+        Path classes = prepareZip();
+        doRunTest((inputSink, out) -> {
+            inputSink.write("/env -class-path " + classes.toString() + "\n");
+            waitOutput(out, Pattern.quote(getResource("jshell.msg.set.restore")) + "\n\u0005");
+            inputSink.write("import jshelltest.*;\n");
+            waitOutput(out, "\n\u0005");
+
+            //-> <tab>
+            inputSink.write("\011");
+            waitOutput(out, getMessage("jshell.console.completion.all.completions.number", "[0-9]+"));
+            inputSink.write("\011");
+            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005");
+
+            //new JShellTes<tab>
+            inputSink.write("new JShellTes\011");
+            waitOutput(out, "t\nJShellTest\\(      JShellTestAux\\(   \n\r\u0005new JShellTest");
+
+            //new JShellTest<tab>
+            inputSink.write("\011");
+            waitOutput(out, "JShellTest\\(      JShellTestAux\\(   \n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
+                            "jshelltest.JShellTest\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
+                            "\r\u0005new JShellTest");
+            inputSink.write("\011");
+            waitOutput(out, "jshelltest.JShellTest\n" +
+                            "JShellTest 0\n" +
+                            "\r\u0005new JShellTest");
+            inputSink.write("\011");
+            waitOutput(out, "JShellTest\\(      JShellTestAux\\(   \n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
+                            "jshelltest.JShellTest\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
+                            "\r\u0005new JShellTest");
+
+            //new JShellTest(<tab>
+            inputSink.write("(\011");
+            waitOutput(out, "\\(\n" +
+                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
+                            "JShellTest\\(String str\\)\n" +
+                            "JShellTest\\(String str, int i\\)\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, "JShellTest\\(String str\\)\n" +
+                            "JShellTest 1\n" +
+                            "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.next.page")) + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.next.javadoc")) + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, "JShellTest\\(String str, int i\\)\n" +
+                            "JShellTest 2\n" +
+                            "\n" +
+                            getMessage("jshell.console.completion.all.completions.number", "[0-9]+") + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005new JShellTest\\(");
+
+            inputSink.write("\u0003String str = \"\";\nnew JShellTest(");
+            waitOutput(out, "\u0005new JShellTest\\(");
+
+            inputSink.write("\011");
+            waitOutput(out, "\n" +
+                            "str   \n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
+                            "JShellTest\\(String str\\)\n" +
+                            "JShellTest\\(String str, int i\\)\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, "JShellTest\\(String str\\)\n" +
+                            "JShellTest 1\n" +
+                            "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.next.page")) + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.next.javadoc")) + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, "JShellTest\\(String str, int i\\)\n" +
+                            "JShellTest 2\n" +
+                            "\n" +
+                            getMessage("jshell.console.completion.all.completions.number", "[0-9]+") + "\n" +
+                            "\r\u0005new JShellTest\\(");
+            inputSink.write("\011");
+            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005new JShellTest\\(");
+
+            inputSink.write("\u0003JShellTest t = new JShellTest\011");
+            waitOutput(out, "\u0005JShellTest t = new JShellTest\n" +
+                            "JShellTest\\(   \n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
+                            "jshelltest.JShellTest\n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.completion.all.completions")) + "\n" +
+                            "\r\u0005JShellTest t = new JShellTest");
+            inputSink.write("\011");
+            waitOutput(out, "JShellTest\\(      JShellTestAux\\(   \n" +
+                            "\n" +
+                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
+                            "\r\u0005JShellTest t = new JShellTest");
+
+            inputSink.write("\u0003JShellTest t = new \011");
+            waitOutput(out, "\u0005JShellTest t = new \n" +
+                            "JShellTest\\(   \n" +
+                            "\n" +
+                            getMessage("jshell.console.completion.all.completions.number", "[0-9]+") + "\n" +
+                            "\r\u0005JShellTest t = new ");
+            inputSink.write("\011");
+            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005JShellTest t = new ");
+
+            inputSink.write("\u0003class JShelX{}\n");
+            inputSink.write("new JShel\011");
+            waitOutput(out, "\u0005new JShel\n" +
+                            "JShelX\\(\\)         JShellTest\\(      JShellTestAux\\(   \n" +
+                            "\r\u0005new JShel");
+
+            //no crash:
+            inputSink.write("\u0003new Stringbuil\011");
+            waitOutput(out, "\u0005new Stringbuil\u0007");
+        });
+    }
+
+    private Path prepareZip() {
+        String clazz1 =
+                "package jshelltest;\n" +
+                "/**JShellTest 0" +
+                " */\n" +
+                "public class JShellTest {\n" +
+                "    /**JShellTest 1\n" +
+                "     * <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1\n" +
+                "     * <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1\n" +
+                "     * <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1\n" +
+                "     */\n" +
+                "    public JShellTest(String str) {}\n" +
+                "    /**JShellTest 2" +
+                "     */\n" +
+                "    public JShellTest(String str, int i) {}\n" +
+                "}\n";
+
+        String clazz2 =
+                "package jshelltest;\n" +
+                "/**JShellTestAux 0" +
+                " */\n" +
+                "public class JShellTestAux {\n" +
+                "    /**JShellTest 1" +
+                "     */\n" +
+                "    public JShellTestAux(String str) { }\n" +
+                "    /**JShellTest 2" +
+                "     */\n" +
+                "    public JShellTestAux(String str, int i) { }\n" +
+                "}\n";
+
+        Path srcZip = Paths.get("src.zip");
+
+        try (JarOutputStream out = new JarOutputStream(Files.newOutputStream(srcZip))) {
+            out.putNextEntry(new JarEntry("jshelltest/JShellTest.java"));
+            out.write(clazz1.getBytes());
+            out.putNextEntry(new JarEntry("jshelltest/JShellTestAux.java"));
+            out.write(clazz2.getBytes());
+        } catch (IOException ex) {
+            throw new IllegalStateException(ex);
+        }
+
+        compiler.compile(clazz1, clazz2);
+
+        try {
+            Field availableSources = Class.forName("jdk.jshell.SourceCodeAnalysisImpl").getDeclaredField("availableSourcesOverride");
+            availableSources.setAccessible(true);
+            availableSources.set(null, Arrays.asList(srcZip));
+        } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException | ClassNotFoundException ex) {
+            throw new IllegalStateException(ex);
+        }
+
+        return compiler.getClassDir();
+    }
+    //where:
+        private final Compiler compiler = new Compiler();
+
+}
--- a/test/jdk/jshell/MergedTabShiftTabTest.java	Thu Apr 20 18:14:07 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,345 +0,0 @@
-/*
- * Copyright (c) 2017, 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.
- *
- * 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.
- */
-
-/**
- * @test
- * @bug 8177076
- * @modules
- *     jdk.compiler/com.sun.tools.javac.api
- *     jdk.compiler/com.sun.tools.javac.main
- *     jdk.jshell/jdk.internal.jshell.tool.resources:open
- *     jdk.jshell/jdk.jshell:open
- * @library /tools/lib
- * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
- * @build Compiler UITesting
- * @build MergedTabShiftTabTest
- * @run testng MergedTabShiftTabTest
- */
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.ResourceBundle;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-import java.util.regex.Pattern;
-
-import jdk.jshell.JShell;
-import org.testng.annotations.Test;
-
-@Test
-public class MergedTabShiftTabTest extends UITesting {
-
-    public void testCommand() throws Exception {
-        doRunTest((inputSink, out) -> {
-            inputSink.write("1\n");
-            waitOutput(out, "\u0005");
-            inputSink.write("/\011");
-            waitOutput(out, ".*/edit.*/list.*\n\n" + Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n\r\u0005/");
-            inputSink.write("\011");
-            waitOutput(out,   ".*\n/edit\n" + Pattern.quote(getResource("help.edit.summary")) +
-                            "\n.*\n/list\n" + Pattern.quote(getResource("help.list.summary")) +
-                            ".*\n\n" + Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/");
-            inputSink.write("\011");
-            waitOutput(out,  "/!\n" +
-                            Pattern.quote(getResource("help.bang")) + "\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.next.command.doc")) + "\n" +
-                            "\r\u0005/");
-            inputSink.write("\011");
-            waitOutput(out,  "/-<n>\n" +
-                            Pattern.quote(getResource("help.previous")) + "\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.next.command.doc")) + "\n" +
-                            "\r\u0005/");
-
-            inputSink.write("lis\011");
-            waitOutput(out, "list $");
-
-            inputSink.write("\011");
-            waitOutput(out, ".*-all.*" +
-                            "\n\n" + Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n\r\u0005/");
-            inputSink.write("\011");
-            waitOutput(out, Pattern.quote(getResource("help.list.summary")) + "\n\n" +
-                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/list ");
-            inputSink.write("\011");
-            waitOutput(out, Pattern.quote(getResource("help.list").replaceAll("\t", "    ")));
-
-            inputSink.write("\u0003/env \011");
-            waitOutput(out, "\u0005/env -\n" +
-                            "-add-exports    -add-modules    -class-path     -module-path    \n" +
-                            "\r\u0005/env -");
-
-            inputSink.write("\011");
-            waitOutput(out, "-add-exports    -add-modules    -class-path     -module-path    \n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n" +
-                            "\r\u0005/env -");
-
-            inputSink.write("\011");
-            waitOutput(out, Pattern.quote(getResource("help.env.summary")) + "\n\n" +
-                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n" +
-                            "\r\u0005/env -");
-
-            inputSink.write("\011");
-            waitOutput(out, Pattern.quote(getResource("help.env").replaceAll("\t", "    ")) + "\n" +
-                            "\r\u0005/env -");
-
-            inputSink.write("\011");
-            waitOutput(out, "-add-exports    -add-modules    -class-path     -module-path    \n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n" +
-                            "\r\u0005/env -");
-
-            inputSink.write("\u0003/exit \011");
-            waitOutput(out, Pattern.quote(getResource("help.exit.summary")) + "\n\n" +
-                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/exit ");
-            inputSink.write("\011");
-            waitOutput(out, Pattern.quote(getResource("help.exit")) + "\n" +
-                            "\r\u0005/exit ");
-            inputSink.write("\011");
-            waitOutput(out, Pattern.quote(getResource("help.exit.summary")) + "\n\n" +
-                            Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/exit ");
-            inputSink.write("\u0003/doesnotexist\011");
-            waitOutput(out, "\u0005/doesnotexist\n" +
-                            Pattern.quote(getResource("jshell.console.no.such.command")) + "\n" +
-                            "\n" +
-                            "\r\u0005/doesnotexist");
-        });
-    }
-
-    public void testExpression() throws Exception {
-        Path classes = prepareZip();
-        doRunTest((inputSink, out) -> {
-            inputSink.write("/env -class-path " + classes.toString() + "\n");
-            waitOutput(out, Pattern.quote(getResource("jshell.msg.set.restore")) + "\n\u0005");
-            inputSink.write("import jshelltest.*;\n");
-            waitOutput(out, "\n\u0005");
-
-            //-> <tab>
-            inputSink.write("\011");
-            waitOutput(out, getMessage("jshell.console.completion.all.completions.number", "[0-9]+"));
-            inputSink.write("\011");
-            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005");
-
-            //new JShellTes<tab>
-            inputSink.write("new JShellTes\011");
-            waitOutput(out, "t\nJShellTest\\(      JShellTestAux\\(   \n\r\u0005new JShellTest");
-
-            //new JShellTest<tab>
-            inputSink.write("\011");
-            waitOutput(out, "JShellTest\\(      JShellTestAux\\(   \n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
-                            "jshelltest.JShellTest\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
-                            "\r\u0005new JShellTest");
-            inputSink.write("\011");
-            waitOutput(out, "jshelltest.JShellTest\n" +
-                            "JShellTest 0\n" +
-                            "\r\u0005new JShellTest");
-            inputSink.write("\011");
-            waitOutput(out, "JShellTest\\(      JShellTestAux\\(   \n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
-                            "jshelltest.JShellTest\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
-                            "\r\u0005new JShellTest");
-
-            //new JShellTest(<tab>
-            inputSink.write("(\011");
-            waitOutput(out, "\\(\n" +
-                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
-                            "JShellTest\\(String str\\)\n" +
-                            "JShellTest\\(String str, int i\\)\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, "JShellTest\\(String str\\)\n" +
-                            "JShellTest 1\n" +
-                            "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.next.page")) + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.next.javadoc")) + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, "JShellTest\\(String str, int i\\)\n" +
-                            "JShellTest 2\n" +
-                            "\n" +
-                            getMessage("jshell.console.completion.all.completions.number", "[0-9]+") + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005new JShellTest\\(");
-
-            inputSink.write("\u0003String str = \"\";\nnew JShellTest(");
-            waitOutput(out, "\u0005new JShellTest\\(");
-
-            inputSink.write("\011");
-            waitOutput(out, "\n" +
-                            "str   \n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
-                            "JShellTest\\(String str\\)\n" +
-                            "JShellTest\\(String str, int i\\)\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, "JShellTest\\(String str\\)\n" +
-                            "JShellTest 1\n" +
-                            "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.next.page")) + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, "1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.next.javadoc")) + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, "JShellTest\\(String str, int i\\)\n" +
-                            "JShellTest 2\n" +
-                            "\n" +
-                            getMessage("jshell.console.completion.all.completions.number", "[0-9]+") + "\n" +
-                            "\r\u0005new JShellTest\\(");
-            inputSink.write("\011");
-            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005new JShellTest\\(");
-
-            inputSink.write("\u0003JShellTest t = new JShellTest\011");
-            waitOutput(out, "\u0005JShellTest t = new JShellTest\n" +
-                            "JShellTest\\(   \n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.completion.current.signatures")) + "\n" +
-                            "jshelltest.JShellTest\n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.completion.all.completions")) + "\n" +
-                            "\r\u0005JShellTest t = new JShellTest");
-            inputSink.write("\011");
-            waitOutput(out, "JShellTest\\(      JShellTestAux\\(   \n" +
-                            "\n" +
-                            Pattern.quote(getResource("jshell.console.see.documentation")) + "\n" +
-                            "\r\u0005JShellTest t = new JShellTest");
-
-            inputSink.write("\u0003JShellTest t = new \011");
-            waitOutput(out, "\u0005JShellTest t = new \n" +
-                            "JShellTest\\(   \n" +
-                            "\n" +
-                            getMessage("jshell.console.completion.all.completions.number", "[0-9]+") + "\n" +
-                            "\r\u0005JShellTest t = new ");
-            inputSink.write("\011");
-            waitOutput(out, ".*String.*StringBuilder.*\n\r\u0005JShellTest t = new ");
-
-            inputSink.write("\u0003class JShelX{}\n");
-            inputSink.write("new JShel\011");
-            waitOutput(out, "\u0005new JShel\n" +
-                            "JShelX\\(\\)         JShellTest\\(      JShellTestAux\\(   \n" +
-                            "\r\u0005new JShel");
-
-            //no crash:
-            inputSink.write("\u0003new Stringbuil\011");
-            waitOutput(out, "\u0005new Stringbuil\u0007");
-        });
-    }
-
-    private Path prepareZip() {
-        String clazz1 =
-                "package jshelltest;\n" +
-                "/**JShellTest 0" +
-                " */\n" +
-                "public class JShellTest {\n" +
-                "    /**JShellTest 1\n" +
-                "     * <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1\n" +
-                "     * <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1\n" +
-                "     * <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1 <p>1\n" +
-                "     */\n" +
-                "    public JShellTest(String str) {}\n" +
-                "    /**JShellTest 2" +
-                "     */\n" +
-                "    public JShellTest(String str, int i) {}\n" +
-                "}\n";
-
-        String clazz2 =
-                "package jshelltest;\n" +
-                "/**JShellTestAux 0" +
-                " */\n" +
-                "public class JShellTestAux {\n" +
-                "    /**JShellTest 1" +
-                "     */\n" +
-                "    public JShellTestAux(String str) { }\n" +
-                "    /**JShellTest 2" +
-                "     */\n" +
-                "    public JShellTestAux(String str, int i) { }\n" +
-                "}\n";
-
-        Path srcZip = Paths.get("src.zip");
-
-        try (JarOutputStream out = new JarOutputStream(Files.newOutputStream(srcZip))) {
-            out.putNextEntry(new JarEntry("jshelltest/JShellTest.java"));
-            out.write(clazz1.getBytes());
-            out.putNextEntry(new JarEntry("jshelltest/JShellTestAux.java"));
-            out.write(clazz2.getBytes());
-        } catch (IOException ex) {
-            throw new IllegalStateException(ex);
-        }
-
-        compiler.compile(clazz1, clazz2);
-
-        try {
-            Field availableSources = Class.forName("jdk.jshell.SourceCodeAnalysisImpl").getDeclaredField("availableSourcesOverride");
-            availableSources.setAccessible(true);
-            availableSources.set(null, Arrays.asList(srcZip));
-        } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException | ClassNotFoundException ex) {
-            throw new IllegalStateException(ex);
-        }
-
-        return compiler.getClassDir();
-    }
-    //where:
-        private final Compiler compiler = new Compiler();
-
-    private final ResourceBundle resources;
-    {
-        resources = ResourceBundle.getBundle("jdk.internal.jshell.tool.resources.l10n", Locale.US, JShell.class.getModule());
-    }
-
-    private String getResource(String key) {
-        return resources.getString(key);
-    }
-
-    private String getMessage(String key, Object... args) {
-        return MessageFormat.format(resources.getString(key), args);
-    }
-
-}
--- a/test/jdk/jshell/UITesting.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/jdk/jshell/UITesting.java	Fri Apr 21 03:34:47 2017 +0000
@@ -27,13 +27,16 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintStream;
 import java.io.Writer;
+import java.text.MessageFormat;
 import java.util.HashMap;
 import java.util.Locale;
+import java.util.ResourceBundle;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import jdk.jshell.JShell;
 import jdk.jshell.tool.JavaShellToolBuilder;
 
 public class UITesting {
@@ -168,6 +171,18 @@
         return result.toString();
     }
 
+    private final ResourceBundle resources;
+    {
+        resources = ResourceBundle.getBundle("jdk.internal.jshell.tool.resources.l10n", Locale.US, JShell.class.getModule());
+    }
+
+    protected String getResource(String key) {
+        return resources.getString(key);
+    }
+
+    protected String getMessage(String key, Object... args) {
+        return MessageFormat.format(resources.getString(key), args);
+    }
     private static class PipeInputStream extends InputStream {
 
         private static final int INITIAL_SIZE = 128;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/javac/modules/LegacyXModuleTest.java	Fri Apr 21 03:34:47 2017 +0000
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8178012
+ * @summary tests for multi-module mode compilation
+ * @library /tools/lib
+ * @modules
+ *      jdk.compiler/com.sun.tools.javac.api
+ *      jdk.compiler/com.sun.tools.javac.main
+ * @build toolbox.ToolBox toolbox.JavacTask toolbox.ModuleBuilder ModuleTestBase
+ * @run main LegacyXModuleTest
+ */
+
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+import toolbox.JavacTask;
+import toolbox.Task;
+
+public class LegacyXModuleTest extends ModuleTestBase {
+
+    public static void main(String... args) throws Exception {
+        new LegacyXModuleTest().runTests();
+    }
+
+    @Test
+    public void testLegacyXModule(Path base) throws Exception {
+        //note: avoiding use of java.base, as that gets special handling on some places:
+        Path src = base.resolve("src");
+        tb.writeJavaFiles(src, "package com.sun.tools.javac.comp; public class Extra { Modules modules; }");
+        Path classes = base.resolve("classes");
+        tb.createDirectories(classes);
+
+        new JavacTask(tb)
+            .options("-XD-Xmodule:jdk.compiler")
+            .outdir(classes)
+            .files(findJavaFiles(src))
+            .run()
+            .writeAll()
+            .getOutput(Task.OutputKind.DIRECT);
+
+        List<String> log = new JavacTask(tb)
+                .options("-XD-Xmodule:java.compiler",
+                         "-XD-Xmodule:jdk.compiler",
+                         "-XDrawDiagnostics")
+                .outdir(classes)
+                .files(findJavaFiles(src))
+                .run(Task.Expect.FAIL)
+                .writeAll()
+                .getOutputLines(Task.OutputKind.DIRECT);
+
+        List<String> actual =
+                Arrays.asList("Extra.java:1:56: compiler.err.cant.resolve.location: kindname.class, Modules, , , " +
+                                                "(compiler.misc.location: kindname.class, com.sun.tools.javac.comp.Extra, null)",
+                              "1 error");
+
+        if (!Objects.equals(actual, log))
+            throw new Exception("expected output not found: " + log);
+    }
+
+}
--- a/test/tools/javadoc/CompletionError.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/tools/javadoc/CompletionError.java	Fri Apr 21 03:34:47 2017 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -27,8 +27,10 @@
  * @summary Check that CompletionFailures for missing classes are not incorrectly passed to
  *          the javadoc API clients.
  * @library /tools/lib
- * @modules jdk.javadoc com.sun.tools.javac.api
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ *          jdk.compiler/com.sun.tools.javac.main
  *          jdk.jdeps/com.sun.tools.javap
+ * @build toolbox.JavacTask toolbox.ToolBox
  * @run main CompletionError
  */
 
@@ -37,6 +39,9 @@
 import com.sun.javadoc.*;
 import com.sun.tools.javadoc.Main;
 
+import toolbox.JavacTask;
+import toolbox.ToolBox;
+
 public class CompletionError extends Doclet
 {
     private static final String template =
@@ -49,6 +54,9 @@
             "   public String toString() { return null; }" +
             "}";
 
+    private static final String testSrc = System.getProperty("test.src");
+    private static final String testClassPath = System.getProperty("test.class.path");
+
     public static void main(String[] args) throws Exception {
         String[] templateParts = template.split("#");
         int sources = templateParts.length / 2;
@@ -75,8 +83,8 @@
                 tb.deleteFiles("CompletionErrorMissing.class", "CompletionErrorIntfMissing.class", "CompletionErrorExcMissing.class");
                 // run javadoc:
                 if (Main.execute("javadoc", "CompletionError", CompletionError.class.getClassLoader(),
-                                 "-classpath", ".",
-                                 System.getProperty("test.src", ".") + File.separatorChar + "CompletionError.java") != 0)
+                                 "-classpath", "." + File.pathSeparator + testClassPath,
+                                 new File(testSrc, "CompletionError.java").getPath()) != 0)
                     throw new Error();
             }
         }
--- a/test/tools/lib/toolbox/ModuleBuilder.java	Thu Apr 20 18:14:07 2017 +0000
+++ b/test/tools/lib/toolbox/ModuleBuilder.java	Fri Apr 21 03:34:47 2017 +0000
@@ -45,6 +45,7 @@
     private String comment = "";
     private List<String> requires = new ArrayList<>();
     private List<String> exports = new ArrayList<>();
+    private List<String> opens = new ArrayList<>();
     private List<String> uses = new ArrayList<>();
     private List<String> provides = new ArrayList<>();
     private List<String> content = new ArrayList<>();
@@ -134,33 +135,6 @@
     }
 
     /**
-     * Adds an unqualified "exports dynamic" directive to the declaration.
-     * @param pkg the name of the package to be exported
-     * @return this builder
-     */
-    public ModuleBuilder exportsDynamic(String pkg) {
-        return addDirective(exports, "exports dynamic " + pkg + ";");
-    }
-
-    /**
-     * Adds an unqualified "exports private" directive to the declaration.
-     * @param pkg the name of the package to be exported
-     * @return this builder
-     */
-    public ModuleBuilder exportsPrivate(String pkg) {
-        return addDirective(exports, "exports private " + pkg + ";");
-    }
-
-    /**
-     * Adds an unqualified "exports dynamic private" directive to the declaration.
-     * @param pkg the name of the package to be exported
-     * @return this builder
-     */
-    public ModuleBuilder exportsDynamicPrivate(String pkg) {
-        return addDirective(exports, "exports dynamic private " + pkg + ";");
-    }
-
-    /**
      * Adds a qualified "exports" directive to the declaration.
      * @param pkg the name of the package to be exported
      * @param module the name of the module to which it is to be exported
@@ -171,33 +145,22 @@
     }
 
     /**
-     * Adds a qualified "exports dynamic" directive to the declaration.
-     * @param pkg the name of the package to be exported
-     * @param module the name of the module to which it is to be exported
+     * Adds an unqualified "opens" directive to the declaration.
+     * @param pkg the name of the package to be opened
      * @return this builder
      */
-    public ModuleBuilder exportsDynamicTo(String pkg, String module) {
-        return addDirective(exports, "exports dynamic " + pkg + " to " + module + ";");
+    public ModuleBuilder opens(String pkg) {
+        return addDirective(opens, "opens " + pkg + ";");
     }
 
     /**
-     * Adds a qualified "exports private" directive to the declaration.
-     * @param pkg the name of the package to be exported
-     * @param module the name of the module to which it is to be exported
+     * Adds a qualified "opens" directive to the declaration.
+     * @param pkg the name of the package to be opened
+     * @param module the name of the module to which it is to be opened
      * @return this builder
      */
-    public ModuleBuilder exportsPrivateTo(String pkg, String module) {
-        return addDirective(exports, "exports private " + pkg + " to " + module + ";");
-    }
-
-    /**
-     * Adds a qualified "exports dynamic private" directive to the declaration.
-     * @param pkg the name of the package to be exported
-     * @param module the name of the module to which it is to be exported
-     * @return this builder
-     */
-    public ModuleBuilder exportsDynamicPrivateTo(String pkg, String module) {
-        return addDirective(exports, "exports dynamic private " + pkg + " to " + module + ";");
+    public ModuleBuilder opensTo(String pkg, String module) {
+        return addDirective(opens, "opens " + pkg + " to " + module + ";");
     }
 
     /**
@@ -254,6 +217,7 @@
         sb.append("module ").append(name).append(" {\n");
         requires.forEach(r -> sb.append("    " + r + "\n"));
         exports.forEach(e -> sb.append("    " + e + "\n"));
+        opens.forEach(o -> sb.append("    " + o + "\n"));
         uses.forEach(u -> sb.append("    " + u + "\n"));
         provides.forEach(p -> sb.append("    " + p + "\n"));
         sb.append("}");