Merge
authorprr
Tue, 22 Nov 2016 11:45:55 -0800
changeset 42521 772febeeeede
parent 42520 6b06f852dc19 (current diff)
parent 42138 a64d6162f64d (diff)
child 42522 b22a29f09a26
Merge
jdk/src/java.base/unix/native/libjli/ergo.c
jdk/src/java.base/unix/native/libjli/ergo.h
jdk/src/java.base/unix/native/libjli/ergo_i586.c
jdk/test/sun/net/www/http/HttpClient/RetryPost.sh
jdk/test/sun/security/tools/keytool/readjar.sh
langtools/test/jdk/javadoc/doclet/testOrdering/order/MethodOrder.java
make/common/CORE_PKGS.gmk
make/common/NON_CORE_PKGS.gmk
--- a/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -386,3 +386,4 @@
 9aadd2163b568d76f8969ad2fb404a63733da359 jdk-9+141
 df0e03e3ca0ed1307793017dfc1a054c8726131c jdk-9+142
 d62173b931bf5b6bffc6e80a9060bb2e8b8efc75 jdk-9+143
+31f5023200d42185b70c4c00ba5672391e4642d0 jdk-9+144
--- a/.hgtags-top-repo	Wed Nov 16 14:27:23 2016 -0800
+++ b/.hgtags-top-repo	Tue Nov 22 11:45:55 2016 -0800
@@ -387,3 +387,4 @@
 2b3e5caafe3594ea507c37675c4d3086f415dc64 jdk-9+142
 1fc62b1c629fb80fdaa639d3b59452a184f0d705 jdk-9+143
 8d337fd6333e28c48aa87880144b840aad82baaf jdk-9+144
+ff98aa9ec9fae991e426ce5926fc9036d25f5562 jdk-9+145
--- a/common/autoconf/basics.m4	Wed Nov 16 14:27:23 2016 -0800
+++ b/common/autoconf/basics.m4	Tue Nov 22 11:45:55 2016 -0800
@@ -1048,7 +1048,9 @@
   # These tools might not be installed by default,
   # need hint on how to install them.
   BASIC_REQUIRE_PROGS(UNZIP, unzip)
-  BASIC_REQUIRE_PROGS(ZIP, zip)
+  # Since zip uses "ZIP" as a environment variable for passing options, we need
+  # to name our variable differently, hence ZIPEXE.
+  BASIC_REQUIRE_PROGS(ZIPEXE, zip)
 
   # Non-required basic tools
 
--- a/common/autoconf/generated-configure.sh	Wed Nov 16 14:27:23 2016 -0800
+++ b/common/autoconf/generated-configure.sh	Tue Nov 22 11:45:55 2016 -0800
@@ -945,7 +945,7 @@
 READELF
 OTOOL
 LDD
-ZIP
+ZIPEXE
 UNZIP
 TAR_SUPPORTS_TRANSFORM
 TAR_INCLUDE_PARAM
@@ -1292,7 +1292,7 @@
 NICE
 MAKE
 UNZIP
-ZIP
+ZIPEXE
 LDD
 OTOOL
 READELF
@@ -2236,7 +2236,7 @@
   NICE        Override default value for NICE
   MAKE        Override default value for MAKE
   UNZIP       Override default value for UNZIP
-  ZIP         Override default value for ZIP
+  ZIPEXE      Override default value for ZIPEXE
   LDD         Override default value for LDD
   OTOOL       Override default value for OTOOL
   READELF     Override default value for READELF
@@ -5093,7 +5093,7 @@
 #CUSTOM_AUTOCONF_INCLUDE
 
 # Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1479120453
+DATE_WHEN_GENERATED=1479822431
 
 ###############################################################################
 #
@@ -21373,13 +21373,15 @@
   fi
 
 
-
-
-
-  # Publish this variable in the help.
-
-
-  if [ -z "${ZIP+x}" ]; then
+  # Since zip uses "ZIP" as a environment variable for passing options, we need
+  # to name our variable differently, hence ZIPEXE.
+
+
+
+  # Publish this variable in the help.
+
+
+  if [ -z "${ZIPEXE+x}" ]; then
     # The variable is not set by user, try to locate tool using the code snippet
     for ac_prog in zip
 do
@@ -21387,56 +21389,56 @@
 set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ZIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $ZIP in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-ZIP=$ac_cv_path_ZIP
-if test -n "$ZIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5
-$as_echo "$ZIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ZIP" && break
-done
-
-  else
-    # The variable is set, but is it from the command line or the environment?
-
-    # Try to remove the string !ZIP! from our list.
-    try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!ZIP!/}
-    if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then
-      # If it failed, the variable was not from the command line. Ignore it,
-      # but warn the user (except for BASH, which is always set by the calling BASH).
-      if test "xZIP" != xBASH; then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of ZIP from the environment. Use command line variables instead." >&5
-$as_echo "$as_me: WARNING: Ignoring value of ZIP from the environment. Use command line variables instead." >&2;}
+if ${ac_cv_path_ZIPEXE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ZIPEXE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ZIPEXE="$ZIPEXE" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ZIPEXE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ZIPEXE=$ac_cv_path_ZIPEXE
+if test -n "$ZIPEXE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIPEXE" >&5
+$as_echo "$ZIPEXE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ZIPEXE" && break
+done
+
+  else
+    # The variable is set, but is it from the command line or the environment?
+
+    # Try to remove the string !ZIPEXE! from our list.
+    try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!ZIPEXE!/}
+    if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then
+      # If it failed, the variable was not from the command line. Ignore it,
+      # but warn the user (except for BASH, which is always set by the calling BASH).
+      if test "xZIPEXE" != xBASH; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of ZIPEXE from the environment. Use command line variables instead." >&5
+$as_echo "$as_me: WARNING: Ignoring value of ZIPEXE from the environment. Use command line variables instead." >&2;}
       fi
       # Try to locate tool using the code snippet
       for ac_prog in zip
@@ -21445,135 +21447,135 @@
 set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ZIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $ZIP in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-ZIP=$ac_cv_path_ZIP
-if test -n "$ZIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5
-$as_echo "$ZIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ZIP" && break
-done
-
-    else
-      # If it succeeded, then it was overridden by the user. We will use it
-      # for the tool.
-
-      # First remove it from the list of overridden variables, so we can test
-      # for unknown variables in the end.
-      CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
-
-      # Check if we try to supply an empty value
-      if test "x$ZIP" = x; then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool ZIP= (no value)" >&5
-$as_echo "$as_me: Setting user supplied tool ZIP= (no value)" >&6;}
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIP" >&5
-$as_echo_n "checking for ZIP... " >&6; }
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
-$as_echo "disabled" >&6; }
-      else
-        # Check if the provided tool contains a complete path.
-        tool_specified="$ZIP"
-        tool_basename="${tool_specified##*/}"
-        if test "x$tool_basename" = "x$tool_specified"; then
-          # A command without a complete path is provided, search $PATH.
-          { $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool ZIP=$tool_basename" >&5
-$as_echo "$as_me: Will search for user supplied tool ZIP=$tool_basename" >&6;}
-          # Extract the first word of "$tool_basename", so it can be a program name with args.
-set dummy $tool_basename; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ZIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $ZIP in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-ZIP=$ac_cv_path_ZIP
-if test -n "$ZIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5
-$as_echo "$ZIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-          if test "x$ZIP" = x; then
-            as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5
-          fi
-        else
-          # Otherwise we believe it is a complete path. Use it as it is.
-          { $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool ZIP=$tool_specified" >&5
-$as_echo "$as_me: Will use user supplied tool ZIP=$tool_specified" >&6;}
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIP" >&5
-$as_echo_n "checking for ZIP... " >&6; }
-          if test ! -x "$tool_specified"; then
-            { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-            as_fn_error $? "User supplied tool ZIP=$tool_specified does not exist or is not executable" "$LINENO" 5
-          fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5
-$as_echo "$tool_specified" >&6; }
-        fi
-      fi
-    fi
-
-  fi
-
-
-
-  if test "x$ZIP" = x; then
-    as_fn_error $? "Could not find required tool for ZIP" "$LINENO" 5
+if ${ac_cv_path_ZIPEXE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ZIPEXE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ZIPEXE="$ZIPEXE" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ZIPEXE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ZIPEXE=$ac_cv_path_ZIPEXE
+if test -n "$ZIPEXE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIPEXE" >&5
+$as_echo "$ZIPEXE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ZIPEXE" && break
+done
+
+    else
+      # If it succeeded, then it was overridden by the user. We will use it
+      # for the tool.
+
+      # First remove it from the list of overridden variables, so we can test
+      # for unknown variables in the end.
+      CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
+
+      # Check if we try to supply an empty value
+      if test "x$ZIPEXE" = x; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool ZIPEXE= (no value)" >&5
+$as_echo "$as_me: Setting user supplied tool ZIPEXE= (no value)" >&6;}
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIPEXE" >&5
+$as_echo_n "checking for ZIPEXE... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+      else
+        # Check if the provided tool contains a complete path.
+        tool_specified="$ZIPEXE"
+        tool_basename="${tool_specified##*/}"
+        if test "x$tool_basename" = "x$tool_specified"; then
+          # A command without a complete path is provided, search $PATH.
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool ZIPEXE=$tool_basename" >&5
+$as_echo "$as_me: Will search for user supplied tool ZIPEXE=$tool_basename" >&6;}
+          # Extract the first word of "$tool_basename", so it can be a program name with args.
+set dummy $tool_basename; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ZIPEXE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ZIPEXE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ZIPEXE="$ZIPEXE" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ZIPEXE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ZIPEXE=$ac_cv_path_ZIPEXE
+if test -n "$ZIPEXE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIPEXE" >&5
+$as_echo "$ZIPEXE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+          if test "x$ZIPEXE" = x; then
+            as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5
+          fi
+        else
+          # Otherwise we believe it is a complete path. Use it as it is.
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool ZIPEXE=$tool_specified" >&5
+$as_echo "$as_me: Will use user supplied tool ZIPEXE=$tool_specified" >&6;}
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIPEXE" >&5
+$as_echo_n "checking for ZIPEXE... " >&6; }
+          if test ! -x "$tool_specified"; then
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+            as_fn_error $? "User supplied tool ZIPEXE=$tool_specified does not exist or is not executable" "$LINENO" 5
+          fi
+          { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5
+$as_echo "$tool_specified" >&6; }
+        fi
+      fi
+    fi
+
+  fi
+
+
+
+  if test "x$ZIPEXE" = x; then
+    as_fn_error $? "Could not find required tool for ZIPEXE" "$LINENO" 5
   fi
 
 
--- a/common/autoconf/spec.gmk.in	Wed Nov 16 14:27:23 2016 -0800
+++ b/common/autoconf/spec.gmk.in	Tue Nov 22 11:45:55 2016 -0800
@@ -657,8 +657,7 @@
 UNIQ:=@UNIQ@
 WC:=@WC@
 XARGS:=@XARGS@
-ZIPEXE:=@ZIP@
-ZIP:=@ZIP@
+ZIPEXE:=@ZIPEXE@
 UNZIP:=@UNZIP@
 MT:=@FIXPATH@ @MT@
 RC:=@FIXPATH@ @RC@
--- a/common/bin/compare.sh	Wed Nov 16 14:27:23 2016 -0800
+++ b/common/bin/compare.sh	Tue Nov 22 11:45:55 2016 -0800
@@ -372,7 +372,7 @@
                 $CAT $OTHER_DIR/$f | eval "$HTML_FILTER" > $OTHER_FILE &
                 $CAT $THIS_DIR/$f  | eval "$HTML_FILTER" > $THIS_FILE &
                 wait
-            elif [ "$f" = "./lib/classlist" ]; then
+            elif [[ "$f" = *"/lib/classlist" ]]; then
                 # The classlist files may have some lines in random order
                 OTHER_FILE=$WORK_DIR/$f.other
                 THIS_FILE=$WORK_DIR/$f.this
@@ -642,69 +642,18 @@
 
     if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
         unset _NT_SYMBOL_PATH
-        # On windows we need to unzip the debug symbols, if present
-        OTHER_FILE_BASE=${OTHER_FILE/.dll/}
-        OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/}
-        OTHER_FILE_BASE=${OTHER_FILE_BASE/.cpl/}
-        DIZ_NAME=$(basename $OTHER_FILE_BASE).diz
-        # Some .exe files have the same name as a .dll file. Make sure the exe
-        # files get the right debug symbols.
-        if [ "$NAME" = "java.exe" ] \
-               && [ -f "$OTHER/support/native/java.base/java_objs/java.diz" ]; then
-            OTHER_DIZ_FILE="$OTHER/support/native/java.base/java_objs/java.diz"
-        elif [ "$NAME" = "jimage.exe" ] \
-               && [ -f "$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
-            OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.jlink/jimage.diz"
-        elif [ "$NAME" = "javacpl.exe" ] \
-               && [ -f "$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
-            OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz"
-        elif [ -f "${OTHER_FILE_BASE}.diz" ]; then
-            OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz
-        else
-            # Some files, jli.dll, appears twice in the image but only one of
-            # them has a diz file next to it.
-            OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)"
-            if [ ! -f "$OTHER_DIZ_FILE" ]; then
-                # As a last resort, look for diz file in the whole build output
-                # dir.
-                OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)"
-            fi
+        if [ "$(uname -o)" = "Cygwin" ]; then
+            THIS=$(cygpath -msa $THIS)
+            OTHER=$(cygpath -msa $OTHER)
         fi
-        if [ -n "$OTHER_DIZ_FILE" ]; then
-            $MKDIR -p $FILE_WORK_DIR/other
-            (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE)
-            export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other"
-        fi
-
-        THIS_FILE_BASE=${THIS_FILE/.dll/}
-        THIS_FILE_BASE=${THIS_FILE_BASE/.exe/}
-        THIS_FILE_BASE=${THIS_FILE_BASE/.cpl/}
-        # Some .exe files have the same name as a .dll file. Make sure the exe
-        # files get the right debug symbols.
-        if [ "$NAME" = "java.exe" ] \
-               && [ -f "$THIS/support/native/java.base/java_objs/java.diz" ]; then
-            THIS_DIZ_FILE="$THIS/support/native/java.base/java_objs/java.diz"
-        elif [ "$NAME" = "jimage.exe" ] \
-               && [ -f "$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
-            THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.jlink/jimage.diz"
-        elif [ "$NAME" = "javacpl.exe" ] \
-               && [ -f "$THIS/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
-            THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz"
-        elif [ -f "${THIS_FILE_BASE}.diz" ]; then
-            THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz
-        else
-            THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)"
-            if [ ! -f "$THIS_DIZ_FILE" ]; then
-                # As a last resort, look for diz file in the whole build output
-                # dir.
-                THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)"
-            fi
-        fi
-        if [ -n "$THIS_DIZ_FILE" ]; then
-            $MKDIR -p $FILE_WORK_DIR/this
-            (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE)
-            export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this"
-        fi
+        # Build an _NT_SYMBOL_PATH that contains all known locations for
+        # pdb files.
+        PDB_DIRS="$(ls -d \
+            {$OTHER,$THIS}/support/modules_{cmds,libs}/{*,*/*} \
+            {$OTHER,$THIS}/support/demos/image/jvmti/*/lib \
+            {$OTHER,$THIS}/support/native/java.base/java_objs \
+            )"
+        export _NT_SYMBOL_PATH="$(echo $PDB_DIRS | tr ' ' ';')"
     fi
 
     if [ -z "$SKIP_BIN_DIFF" ]; then
--- a/common/bin/compare_exceptions.sh.incl	Wed Nov 16 14:27:23 2016 -0800
+++ b/common/bin/compare_exceptions.sh.incl	Tue Nov 22 11:45:55 2016 -0800
@@ -431,6 +431,8 @@
 
   ACCEPTED_JARZIP_CONTENTS="
       /modules_libs/java.security.jgss/w2k_lsa_auth.diz
+      /modules_libs/java.security.jgss/w2k_lsa_auth.pdb
+      /modules_libs/java.security.jgss/w2k_lsa_auth.map
       /modules_libs/java.security.jgss/w2k_lsa_auth.dll
       "
 
--- a/corba/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/corba/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -386,3 +386,4 @@
 b32f998da32b488ec7c4e9dbb3c750841b48e74d jdk-9+141
 408c9c621938ca028e20bced0459f815de47eba8 jdk-9+142
 6211236ef15ec796806357608b1dd1b70c258ece jdk-9+143
+d4f1dae174098e799c48948e866054c52e11a186 jdk-9+144
--- a/hotspot/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/hotspot/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -546,3 +546,4 @@
 160a00bc6ed0af1fdf8418fc65e6bddbbc0c536d jdk-9+141
 7b48d63dfd6b8e2657288de3d7b1f153dee02d7e jdk-9+142
 d87d5d430c42342f0320ca7f5cbe0cbd1f9d62ba jdk-9+143
+6187b582d02aee38341dc8ce4011906e9b364e9f jdk-9+144
--- a/jaxp/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/jaxp/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -386,3 +386,4 @@
 037c095ba0c345edbeaaab52fda913a76c3930c0 jdk-9+141
 bdafa0cc34a97a2f8db4847a4efd34b407943591 jdk-9+142
 ce81d03ad7320dca3d673374c1a33bc0efd9136a jdk-9+143
+99be33734ff62b75116b1202d49a4d4e1bda4226 jdk-9+144
--- a/jaxws/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/jaxws/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -389,3 +389,4 @@
 b2c18f755228d1d19a86cd7d5fa1abb6b1495dfb jdk-9+141
 59101416d90160cfcb4f45dfbccaec15e2c27a29 jdk-9+142
 1c988e708a06257119d54d8a57e99e3b0f37ff18 jdk-9+143
+92523c51d6a48b0a83912ba3cc43bc57b8159c2a jdk-9+144
--- a/jdk/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -386,3 +386,4 @@
 8d752af5f61d41f226adf2cda72a20faa9ad620a jdk-9+141
 6ce43dd8e954b452f330dd7a412df5107f7e1923 jdk-9+142
 8dbc8594f9d5149bf1c22221272284609408227a jdk-9+143
+efa71dc820eb8bd5a6c9f2f66f39c383ac3ee99d jdk-9+144
--- a/jdk/make/data/tzdata/VERSION	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/data/tzdata/VERSION	Tue Nov 22 11:45:55 2016 -0800
@@ -21,4 +21,4 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-tzdata2016h
+tzdata2016i
--- a/jdk/make/data/tzdata/antarctica	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/data/tzdata/antarctica	Tue Nov 22 11:45:55 2016 -0800
@@ -87,13 +87,18 @@
 # Background:
 # http://www.timeanddate.com/news/time/antartica-time-changes-2010.html
 
+# From Steffen Thorsen (2016-10-28):
+# Australian Antarctica Division informed us that Casey changed time
+# zone to UTC+11 in "the morning of 22nd October 2016".
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Antarctica/Casey	0	-	-00	1969
 			8:00	-	+08	2009 Oct 18  2:00
 			11:00	-	+11	2010 Mar  5  2:00
 			8:00	-	+08	2011 Oct 28  2:00
 			11:00	-	+11	2012 Feb 21 17:00u
-			8:00	-	+08
+			8:00	-	+08	2016 Oct 22
+			11:00	-	+11
 Zone Antarctica/Davis	0	-	-00	1957 Jan 13
 			7:00	-	+07	1964 Nov
 			0	-	-00	1969 Feb
--- a/jdk/make/data/tzdata/asia	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/data/tzdata/asia	Tue Nov 22 11:45:55 2016 -0800
@@ -794,9 +794,19 @@
 ###############################################################################
 
 # Cyprus
-#
+
 # Milne says the Eastern Telegraph Company used 2:14:00.  Stick with LMT.
+# IATA SSIM (1998-09) has Cyprus using EU rules for the first time.
+
+# From Paul Eggert (2016-09-09):
+# Yesterday's Cyprus Mail reports that Northern Cyprus followed Turkey's
+# lead and switched from +02/+03 to +03 year-round.
+# http://cyprus-mail.com/2016/09/08/two-time-zones-cyprus-turkey-will-not-turn-clocks-back-next-month/
 #
+# From Even Scharning (2016-10-31):
+# Looks like the time zone split in Cyprus went through last night.
+# http://cyprus-mail.com/2016/10/30/cyprus-new-division-two-time-zones-now-reality/
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cyprus	1975	only	-	Apr	13	0:00	1:00	S
 Rule	Cyprus	1975	only	-	Oct	12	0:00	0	-
@@ -811,7 +821,10 @@
 Zone	Asia/Nicosia	2:13:28 -	LMT	1921 Nov 14
 			2:00	Cyprus	EE%sT	1998 Sep
 			2:00	EUAsia	EE%sT
-# IATA SSIM (1998-09) has Cyprus using EU rules for the first time.
+Zone	Asia/Famagusta	2:15:48	-	LMT	1921 Nov 14
+			2:00	Cyprus	EE%sT	1998 Sep
+			2:00	EUAsia	EE%sT	2016 Sep  8
+			3:00	-	+03
 
 # Classically, Cyprus belongs to Asia; e.g. see Herodotus, Histories, I.72.
 # However, for various reasons many users expect to find it under Europe.
--- a/jdk/make/data/tzdata/australasia	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/data/tzdata/australasia	Tue Nov 22 11:45:55 2016 -0800
@@ -725,11 +725,13 @@
 Rule	Tonga	2000	only	-	Mar	19	2:00s	0	-
 Rule	Tonga	2000	2001	-	Nov	Sun>=1	2:00	1:00	S
 Rule	Tonga	2001	2002	-	Jan	lastSun	2:00	0	-
+Rule	Tonga	2016	max	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Tonga	2017	max	-	Jan	Sun>=15	3:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Pacific/Tongatapu	12:19:20 -	LMT	1901
-			12:20	-	TOT	1941 # Tonga Time
-			13:00	-	TOT	1999
-			13:00	Tonga	TO%sT
+			12:20	-	+1220	1941
+			13:00	-	+13	1999
+			13:00	Tonga	+13/+14
 
 # Tuvalu
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1735,9 +1737,17 @@
 # of January the standard time in the Kingdom shall be moved backward by one
 # hour to 1:00am.
 
-# From Pulu 'Anau (2002-11-05):
+# From Pulu ʻAnau (2002-11-05):
 # The law was for 3 years, supposedly to get renewed.  It wasn't.
 
+# From Pulu ʻAnau (2016-10-27):
+# http://mic.gov.to/news-today/press-releases/6375-daylight-saving-set-to-run-from-6-november-2016-to-15-january-2017
+# Cannot find anyone who knows the rules, has seen the duration or has seen
+# the cabinet decision, but it appears we are following Fiji's rule set.
+#
+# From Tim Parenti (2016-10-26):
+# Assume Tonga will observe DST from the first Sunday in November at 02:00
+# through the third Sunday in January at 03:00, like Fiji, for now.
 
 # Wake
 
--- a/jdk/make/data/tzdata/europe	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/data/tzdata/europe	Tue Nov 22 11:45:55 2016 -0800
@@ -1523,73 +1523,84 @@
 # But these events all occurred before the 1970 cutoff,
 # so record only the time in Rome.
 #
-# From Paul Eggert (2006-03-22):
-# For Italian DST we have three sources: Shanks & Pottenger, Whitman, and
-# F. Pollastri
-# Day-light Saving Time in Italy (2006-02-03)
-# http://toi.iriti.cnr.it/uk/ienitlt.html
-# ('FP' below), taken from an Italian National Electrotechnical Institute
-# publication. When the three sources disagree, guess who's right, as follows:
+# From Michael Deckers (2016-10-24):
+# http://www.ac-ilsestante.it/MERIDIANE/ora_legale quotes a law of 1893-08-10
+# ... [translated as] "The preceding dispositions will enter into
+# force at the instant at which, according to the time specified in
+# the 1st article, the 1st of November 1893 will begin...."
 #
-# year	FP	Shanks&P. (S)	Whitman (W)	Go with:
-# 1916	06-03	06-03 24:00	06-03 00:00	FP & W
-#	09-30	09-30 24:00	09-30 01:00	FP; guess 24:00s
-# 1917	04-01	03-31 24:00	03-31 00:00	FP & S
-#	09-30	09-29 24:00	09-30 01:00	FP & W
-# 1918	03-09	03-09 24:00	03-09 00:00	FP & S
-#	10-06	10-05 24:00	10-06 01:00	FP & W
-# 1919	03-01	03-01 24:00	03-01 00:00	FP & S
-#	10-04	10-04 24:00	10-04 01:00	FP; guess 24:00s
-# 1920	03-20	03-20 24:00	03-20 00:00	FP & S
-#	09-18	09-18 24:00	10-01 01:00	FP; guess 24:00s
-# 1944	04-02	04-03 02:00			S (see C-Eur)
-#	09-16	10-02 03:00			FP; guess 24:00s
-# 1945	09-14	09-16 24:00			FP; guess 24:00s
-# 1970	05-21	05-31 00:00			S
-#	09-20	09-27 00:00			S
+# From Pierpaolo Bernardi (2016-10-20):
+# The authoritative source for time in Italy is the national metrological
+# institute, which has a summary page of historical DST data at
+# http://www.inrim.it/res/tf/ora_legale_i.shtml
+# (2016-10-24):
+# http://www.renzobaldini.it/le-ore-legali-in-italia/
+# has still different data for 1944.  It divides Italy in two, as
+# there were effectively two governments at the time, north of Gothic
+# Line German controlled territory, official government RSI, and south
+# of the Gothic Line, controlled by allied armies.
+#
+# From Brian Inglis (2016-10-23):
+# Viceregal LEGISLATIVE DECREE. 14 September 1944, no. 219.
+# Restoration of Standard Time. (044U0219) (OJ 62 of 30.9.1944) ...
+# Given the R. law decreed on 1944-03-29, no. 92, by which standard time is
+# advanced to sixty minutes later starting at hour two on 1944-04-02; ...
+# Starting at hour three on the date 1944-09-17 standard time will be resumed.
+#
+# From Paul Eggert (2016-10-27):
+# Go with INRiM for DST rules, except as corrected by Inglis for 1944
+# for the Kingdom of Italy.  This is consistent with Renzo Baldini.
+# Model Rome's occupation by using using C-Eur rules from 1943-09-10
+# to 1944-06-04; although Rome was an open city during this period, it
+# was effectively controlled by Germany.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Italy	1916	only	-	Jun	 3	0:00s	1:00	S
-Rule	Italy	1916	only	-	Oct	 1	0:00s	0	-
-Rule	Italy	1917	only	-	Apr	 1	0:00s	1:00	S
-Rule	Italy	1917	only	-	Sep	30	0:00s	0	-
-Rule	Italy	1918	only	-	Mar	10	0:00s	1:00	S
-Rule	Italy	1918	1919	-	Oct	Sun>=1	0:00s	0	-
-Rule	Italy	1919	only	-	Mar	 2	0:00s	1:00	S
-Rule	Italy	1920	only	-	Mar	21	0:00s	1:00	S
-Rule	Italy	1920	only	-	Sep	19	0:00s	0	-
-Rule	Italy	1940	only	-	Jun	15	0:00s	1:00	S
-Rule	Italy	1944	only	-	Sep	17	0:00s	0	-
-Rule	Italy	1945	only	-	Apr	 2	2:00	1:00	S
-Rule	Italy	1945	only	-	Sep	15	0:00s	0	-
-Rule	Italy	1946	only	-	Mar	17	2:00s	1:00	S
-Rule	Italy	1946	only	-	Oct	 6	2:00s	0	-
-Rule	Italy	1947	only	-	Mar	16	0:00s	1:00	S
-Rule	Italy	1947	only	-	Oct	 5	0:00s	0	-
-Rule	Italy	1948	only	-	Feb	29	2:00s	1:00	S
-Rule	Italy	1948	only	-	Oct	 3	2:00s	0	-
-Rule	Italy	1966	1968	-	May	Sun>=22	0:00	1:00	S
-Rule	Italy	1966	1969	-	Sep	Sun>=22	0:00	0	-
-Rule	Italy	1969	only	-	Jun	 1	0:00	1:00	S
-Rule	Italy	1970	only	-	May	31	0:00	1:00	S
-Rule	Italy	1970	only	-	Sep	lastSun	0:00	0	-
-Rule	Italy	1971	1972	-	May	Sun>=22	0:00	1:00	S
-Rule	Italy	1971	only	-	Sep	lastSun	1:00	0	-
-Rule	Italy	1972	only	-	Oct	 1	0:00	0	-
-Rule	Italy	1973	only	-	Jun	 3	0:00	1:00	S
-Rule	Italy	1973	1974	-	Sep	lastSun	0:00	0	-
-Rule	Italy	1974	only	-	May	26	0:00	1:00	S
-Rule	Italy	1975	only	-	Jun	 1	0:00s	1:00	S
-Rule	Italy	1975	1977	-	Sep	lastSun	0:00s	0	-
-Rule	Italy	1976	only	-	May	30	0:00s	1:00	S
-Rule	Italy	1977	1979	-	May	Sun>=22	0:00s	1:00	S
-Rule	Italy	1978	only	-	Oct	 1	0:00s	0	-
-Rule	Italy	1979	only	-	Sep	30	0:00s	0	-
+Rule	Italy	1916	only	-	Jun	 3	24:00	1:00	S
+Rule	Italy	1916	1917	-	Sep	30	24:00	0	-
+Rule	Italy	1917	only	-	Mar	31	24:00	1:00	S
+Rule	Italy	1918	only	-	Mar	 9	24:00	1:00	S
+Rule	Italy	1918	only	-	Oct	 6	24:00	0	-
+Rule	Italy	1919	only	-	Mar	 1	24:00	1:00	S
+Rule	Italy	1919	only	-	Oct	 4	24:00	0	-
+Rule	Italy	1920	only	-	Mar	20	24:00	1:00	S
+Rule	Italy	1920	only	-	Sep	18	24:00	0	-
+Rule	Italy	1940	only	-	Jun	14	24:00	1:00	S
+Rule	Italy	1942	only	-	Nov	 2	 2:00s	0	-
+Rule	Italy	1943	only	-	Mar	29	 2:00s	1:00	S
+Rule	Italy	1943	only	-	Oct	 4	 2:00s	0	-
+Rule	Italy	1944	only	-	Apr	 2	 2:00s	1:00	S
+Rule	Italy	1944	only	-	Sep	17	 2:00s	0	-
+Rule	Italy	1945	only	-	Apr	 2	 2:00	1:00	S
+Rule	Italy	1945	only	-	Sep	15	 1:00	0	-
+Rule	Italy	1946	only	-	Mar	17	 2:00s	1:00	S
+Rule	Italy	1946	only	-	Oct	 6	 2:00s	0	-
+Rule	Italy	1947	only	-	Mar	16	 0:00s	1:00	S
+Rule	Italy	1947	only	-	Oct	 5	 0:00s	0	-
+Rule	Italy	1948	only	-	Feb	29	 2:00s	1:00	S
+Rule	Italy	1948	only	-	Oct	 3	 2:00s	0	-
+Rule	Italy	1966	1968	-	May	Sun>=22	 0:00s	1:00	S
+Rule	Italy	1966	only	-	Sep	24	24:00	0	-
+Rule	Italy	1967	1969	-	Sep	Sun>=22	 0:00s	0	-
+Rule	Italy	1969	only	-	Jun	 1	 0:00s	1:00	S
+Rule	Italy	1970	only	-	May	31	 0:00s	1:00	S
+Rule	Italy	1970	only	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1971	1972	-	May	Sun>=22	 0:00s	1:00	S
+Rule	Italy	1971	only	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1972	only	-	Oct	 1	 0:00s	0	-
+Rule	Italy	1973	only	-	Jun	 3	 0:00s	1:00	S
+Rule	Italy	1973	1974	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1974	only	-	May	26	 0:00s	1:00	S
+Rule	Italy	1975	only	-	Jun	 1	 0:00s	1:00	S
+Rule	Italy	1975	1977	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1976	only	-	May	30	 0:00s	1:00	S
+Rule	Italy	1977	1979	-	May	Sun>=22	 0:00s	1:00	S
+Rule	Italy	1978	only	-	Oct	 1	 0:00s	0	-
+Rule	Italy	1979	only	-	Sep	30	 0:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Rome	0:49:56 -	LMT	1866 Sep 22
-			0:49:56	-	RMT	1893 Nov  1  0:00s # Rome Mean
-			1:00	Italy	CE%sT	1942 Nov  2  2:00s
-			1:00	C-Eur	CE%sT	1944 Jul
+			0:49:56	-	RMT	1893 Oct 31 23:49:56 # Rome Mean
+			1:00	Italy	CE%sT	1943 Sep 10
+			1:00	C-Eur	CE%sT	1944 Jun  4
 			1:00	Italy	CE%sT	1980
 			1:00	EU	CE%sT
 
@@ -1788,6 +1799,10 @@
 # See Europe/Belgrade.
 
 # Malta
+#
+# From Paul Eggert (2016-10-21):
+# Assume 1900-1972 was like Rome, overriding Shanks.
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Malta	1973	only	-	Mar	31	0:00s	1:00	S
 Rule	Malta	1973	only	-	Sep	29	0:00s	0	-
@@ -1798,8 +1813,6 @@
 Rule	Malta	1980	only	-	Mar	31	2:00	1:00	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Malta	0:58:04 -	LMT	1893 Nov  2  0:00s # Valletta
-			1:00	Italy	CE%sT	1942 Nov  2  2:00s
-			1:00	C-Eur	CE%sT	1945 Apr  2  2:00s
 			1:00	Italy	CE%sT	1973 Mar 31
 			1:00	Malta	CE%sT	1981
 			1:00	EU	CE%sT
@@ -1931,7 +1944,7 @@
 # Amsterdam mean time.
 
 # The data entries before 1945 are taken from
-# http://www.staff.science.uu.nl/~gent0113/idl/idl.htm
+# http://www.staff.science.uu.nl/~gent0113/wettijd/wettijd.htm
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Neth	1916	only	-	May	 1	0:00	1:00	NST	# Netherlands Summer Time
--- a/jdk/make/data/tzdata/zone.tab	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/data/tzdata/zone.tab	Tue Nov 22 11:45:55 2016 -0800
@@ -175,7 +175,8 @@
 CV	+1455-02331	Atlantic/Cape_Verde
 CW	+1211-06900	America/Curacao
 CX	-1025+10543	Indian/Christmas
-CY	+3510+03322	Asia/Nicosia
+CY	+3510+03322	Asia/Nicosia	Cyprus (most areas)
+CY	+3507+03357	Asia/Famagusta	Northern Cyprus
 CZ	+5005+01426	Europe/Prague
 DE	+5230+01322	Europe/Berlin	Germany (most areas)
 DE	+4742+00841	Europe/Busingen	Busingen
--- a/jdk/make/launcher/Launcher-jdk.compiler.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/launcher/Launcher-jdk.compiler.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -28,14 +28,12 @@
 $(eval $(call SetupBuildLauncher, javac, \
    MAIN_CLASS := com.sun.tools.javac.Main, \
    JAVA_ARGS := --add-modules ALL-DEFAULT, \
-   CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+   CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
 
 $(eval $(call SetupBuildLauncher, javah, \
     MAIN_CLASS := com.sun.tools.javah.Main, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
 
 $(eval $(call SetupBuildLauncher, serialver, \
@@ -48,8 +46,7 @@
   # into any real images
   $(eval $(call SetupBuildLauncher, sjavac, \
       MAIN_CLASS := com.sun.tools.sjavac.Main, \
-      CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-          -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+      CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
       OUTPUT_DIR := $(JDK_OUTPUTDIR)/bin, \
   ))
 endif
--- a/jdk/make/launcher/Launcher-jdk.javadoc.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/launcher/Launcher-jdk.javadoc.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -28,6 +28,5 @@
 $(eval $(call SetupBuildLauncher, javadoc, \
     MAIN_CLASS := jdk.javadoc.internal.tool.Main, \
     JAVA_ARGS := --add-modules ALL-DEFAULT, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
--- a/jdk/make/launcher/Launcher-jdk.jdeps.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/launcher/Launcher-jdk.jdeps.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -27,18 +27,15 @@
 
 $(eval $(call SetupBuildLauncher, javap, \
     MAIN_CLASS := com.sun.tools.javap.Main, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
 
 $(eval $(call SetupBuildLauncher, jdeps, \
     MAIN_CLASS := com.sun.tools.jdeps.Main, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
 
 $(eval $(call SetupBuildLauncher, jdeprscan, \
     MAIN_CLASS := com.sun.tools.jdeprscan.Main, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
--- a/jdk/make/launcher/Launcher-jdk.jlink.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/launcher/Launcher-jdk.jlink.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -34,13 +34,11 @@
     MAIN_CLASS := jdk.tools.jlink.internal.Main, \
     JAVA_ARGS :=  --add-modules ALL-DEFAULT, \
     CFLAGS := -DENABLE_ARG_FILES \
-        -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+        -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
 
 $(eval $(call SetupBuildLauncher, jmod,\
     MAIN_CLASS := jdk.tools.jmod.Main, \
     CFLAGS := -DENABLE_ARG_FILES \
-        -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+        -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
--- a/jdk/make/launcher/Launcher-jdk.jshell.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/launcher/Launcher-jdk.jshell.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -27,6 +27,5 @@
 
 $(eval $(call SetupBuildLauncher, jshell, \
     MAIN_CLASS := jdk.internal.jshell.tool.JShellTool, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-        -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
+    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
--- a/jdk/make/mapfiles/libjava/mapfile-vers	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/mapfiles/libjava/mapfile-vers	Tue Nov 22 11:45:55 2016 -0800
@@ -77,13 +77,13 @@
 		Java_java_io_FileDescriptor_initIDs;
 		Java_java_io_FileDescriptor_sync;
 		Java_java_io_FileDescriptor_getAppend;
-		Java_java_io_FileInputStream_available;
+		Java_java_io_FileInputStream_available0;
 		Java_java_io_FileInputStream_close0;
 		Java_java_io_FileInputStream_initIDs;
 		Java_java_io_FileInputStream_open0;
 		Java_java_io_FileInputStream_read0;
 		Java_java_io_FileInputStream_readBytes;
-		Java_java_io_FileInputStream_skip;
+		Java_java_io_FileInputStream_skip0;
 		Java_java_io_FileOutputStream_close0;
 		Java_java_io_FileOutputStream_initIDs;
 		Java_java_io_FileOutputStream_open0;
--- a/jdk/make/mapfiles/libjava/reorder-sparc	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/mapfiles/libjava/reorder-sparc	Tue Nov 22 11:45:55 2016 -0800
@@ -44,7 +44,7 @@
 text: .text%fileOpen;
 text: .text%Java_java_io_FileInputStream_readBytes;
 text: .text%readBytes;
-text: .text%Java_java_io_FileInputStream_available;
+text: .text%Java_java_io_FileInputStream_available0;
 text: .text%Java_java_io_FileInputStream_close0;
 text: .text%Java_java_lang_System_mapLibraryName;
 text: .text%Java_java_io_UnixFileSystem_getBooleanAttributes0;
--- a/jdk/make/mapfiles/libjava/reorder-sparcv9	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/mapfiles/libjava/reorder-sparcv9	Tue Nov 22 11:45:55 2016 -0800
@@ -48,7 +48,7 @@
 text: .text%fileOpen;
 text: .text%Java_java_io_FileInputStream_readBytes;
 text: .text%readBytes;
-text: .text%Java_java_io_FileInputStream_available;
+text: .text%Java_java_io_FileInputStream_available0;
 text: .text%Java_java_io_FileInputStream_close0;
 text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2;
 text: .text%Java_java_io_UnixFileSystem_list;
--- a/jdk/make/mapfiles/libjava/reorder-x86	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/make/mapfiles/libjava/reorder-x86	Tue Nov 22 11:45:55 2016 -0800
@@ -76,7 +76,7 @@
 text: .text%JNU_GetEnv;
 text: .text%Java_java_io_UnixFileSystem_checkAccess;
 text: .text%Java_sun_reflect_NativeMethodAccessorImpl_invoke0;
-text: .text%Java_java_io_FileInputStream_available;
+text: .text%Java_java_io_FileInputStream_available0;
 text: .text%Java_java_lang_reflect_Array_newArray;
 text: .text%Java_java_lang_StackTraceElement_initStackTraceElements;
 text: .text%Java_java_lang_System_identityHashCode;
--- a/jdk/src/java.base/linux/classes/sun/nio/ch/EPollArrayWrapper.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/linux/classes/sun/nio/ch/EPollArrayWrapper.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, 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
@@ -118,7 +118,7 @@
     // file descriptors higher than MAX_UPDATE_ARRAY_SIZE (unlimited case at
     // least) then the update is stored in a map.
     private final byte[] eventsLow = new byte[MAX_UPDATE_ARRAY_SIZE];
-    private Map<Integer,Byte> eventsHigh;
+    private final Map<Integer,Byte> eventsHigh = new HashMap<>();
 
     // Used by release and updateRegistrations to track whether a file
     // descriptor is registered with epoll.
@@ -133,10 +133,6 @@
         int allocationSize = NUM_EPOLLEVENTS * SIZE_EPOLLEVENT;
         pollArray = new AllocatedNativeObject(allocationSize, true);
         pollArrayAddress = pollArray.address();
-
-        // eventHigh needed when using file descriptors > 64k
-        if (OPEN_MAX > MAX_UPDATE_ARRAY_SIZE)
-            eventsHigh = new HashMap<>();
     }
 
     void initInterrupt(int fd0, int fd1) {
--- a/jdk/src/java.base/macosx/conf/x86_64/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/macosx/conf/x86_64/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -23,7 +23,7 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, 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
@@ -922,11 +922,6 @@
    /* Linux only */
 }
 
-jboolean
-ServerClassMachine(void) {
-    return JNI_TRUE;
-}
-
 static JavaVM* jvmInstance = NULL;
 static jboolean sameThread = JNI_FALSE; /* start VM in current thread */
 
--- a/jdk/src/java.base/share/classes/java/io/FileInputStream.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/io/FileInputStream.java	Tue Nov 22 11:45:55 2016 -0800
@@ -280,7 +280,11 @@
      * @exception  IOException  if n is negative, if the stream does not
      *             support seek, or if an I/O error occurs.
      */
-    public native long skip(long n) throws IOException;
+    public long skip(long n) throws IOException {
+        return skip0(n);
+    }
+
+    private native long skip0(long n) throws IOException;
 
     /**
      * Returns an estimate of the number of remaining bytes that can be read (or
@@ -299,7 +303,11 @@
      * @exception  IOException  if this file input stream has been closed by calling
      *             {@code close} or an I/O error occurs.
      */
-    public native int available() throws IOException;
+    public int available() throws IOException {
+        return available0();
+    }
+
+    private native int available0() throws IOException;
 
     /**
      * Closes this file input stream and releases any system resources
--- a/jdk/src/java.base/share/classes/java/net/NetworkInterface.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/net/NetworkInterface.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -335,15 +335,19 @@
      * {@link #getInetAddresses()} to obtain all IP addresses for this node
      *
      * @return an Enumeration of NetworkInterfaces found on this machine
-     * @exception  SocketException  if an I/O error occurs.
+     * @exception  SocketException  if an I/O error occurs,
+     *             or if the platform does not have at least one configured
+     *             network interface.
      * @see #networkInterfaces()
      */
     public static Enumeration<NetworkInterface> getNetworkInterfaces()
         throws SocketException {
         NetworkInterface[] netifs = getAll();
-        assert netifs != null && netifs.length > 0;
-
-        return enumerationFromArray(netifs);
+        if (netifs != null && netifs.length > 0) {
+            return enumerationFromArray(netifs);
+        } else {
+            throw new SocketException("No network interfaces configured");
+        }
     }
 
     /**
@@ -361,15 +365,19 @@
      * }</pre>
      *
      * @return a Stream of NetworkInterfaces found on this machine
-     * @exception  SocketException  if an I/O error occurs.
+     * @exception  SocketException  if an I/O error occurs,
+     *             or if the platform does not have at least one configured
+     *             network interface.
      * @since 9
      */
     public static Stream<NetworkInterface> networkInterfaces()
         throws SocketException {
         NetworkInterface[] netifs = getAll();
-        assert netifs != null && netifs.length > 0;
-
-        return streamFromArray(netifs);
+        if (netifs != null && netifs.length > 0) {
+            return streamFromArray(netifs);
+        }  else {
+            throw new SocketException("No network interfaces configured");
+        }
     }
 
     private static <T> Enumeration<T> enumerationFromArray(T[] a) {
--- a/jdk/src/java.base/share/classes/java/util/Optional.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/util/Optional.java	Tue Nov 22 11:45:55 2016 -0800
@@ -214,20 +214,20 @@
      * @apiNote
      * This method supports post-processing on {@code Optional} values, without
      * the need to explicitly check for a return status.  For example, the
-     * following code traverses a stream of file names, selects one that has not
-     * yet been processed, and then opens that file, returning an
-     * {@code Optional<FileInputStream>}:
+     * following code traverses a stream of URIs, selects one that has not
+     * yet been processed, and creates a path from that URI, returning
+     * an {@code Optional<Path>}:
      *
      * <pre>{@code
-     *     Optional<FileInputStream> fis =
-     *         names.stream().filter(name -> !isProcessedYet(name))
+     *     Optional<Path> p =
+     *         uris.stream().filter(uri -> !isProcessedYet(uri))
      *                       .findFirst()
-     *                       .map(name -> new FileInputStream(name));
+     *                       .map(Paths::get);
      * }</pre>
      *
-     * Here, {@code findFirst} returns an {@code Optional<String>}, and then
-     * {@code map} returns an {@code Optional<FileInputStream>} for the desired
-     * file if one exists.
+     * Here, {@code findFirst} returns an {@code Optional<URI>}, and then
+     * {@code map} returns an {@code Optional<Path>} for the desired
+     * URI if one exists.
      *
      * @param mapper the mapping function to apply to a value, if present
      * @param <U> The type of the value returned from the mapping function
--- a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Tue Nov 22 11:45:55 2016 -0800
@@ -192,9 +192,10 @@
     public static final String MANIFEST_NAME = META_INF + "MANIFEST.MF";
 
     /**
-     * The version that represents the unversioned configuration of a multi-release jar file.
+     * Returns the version that represents the unversioned configuration of a
+     * multi-release jar file.
      *
-     * @return Runtime.Version that represents the unversioned configuration
+     * @return the version that represents the unversioned configuration
      *
      * @since 9
      */
@@ -203,13 +204,16 @@
     }
 
     /**
-     * The version that represents the effective runtime versioned configuration of a
-     * multi-release jar file.  In most cases, {@code runtimeVersion()} is equal to
-     * {@code Runtime.version()}.  However, if the {@code jdk.util.jar.version} property is set,
-     * {@code runtimeVersion()} is derived from that property and may not be equal to
-     * {@code Runtime.version()}.
+     * Returns the version that represents the effective runtime versioned
+     * configuration of a multi-release jar file.
+     * <p>
+     * By default the major version number of the returned {@code Version} will
+     * be equal to the major version number of {@code Runtime.version()}.
+     * However, if the {@code jdk.util.jar.version} property is set, the
+     * returned {@code Version} is derived from that property and major version
+     * numbers may not be equal.
      *
-     * @return Runtime.Version that represents the runtime versioned configuration
+     * @return the version that represents the runtime versioned configuration
      *
      * @since 9
      */
@@ -335,6 +339,10 @@
 
     /**
      * Returns the maximum version used when searching for versioned entries.
+     * <p>
+     * If this {@code JarFile} is not a multi-release jar file or is not
+     * configured to be processed as such, then the version returned will be the
+     * same as that returned from {@link #baseVersion()}.
      *
      * @return the maximum version
      * @since 9
--- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2016, 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
@@ -139,8 +139,7 @@
      *    line entirely.
      */
     static void showSettings(boolean printToStderr, String optionFlag,
-            long initialHeapSize, long maxHeapSize, long stackSize,
-            boolean isServer) {
+            long initialHeapSize, long maxHeapSize, long stackSize) {
 
         initOutput(printToStderr);
         String opts[] = optionFlag.split(":");
@@ -149,8 +148,7 @@
                 : "all";
         switch (optStr) {
             case "vm":
-                printVmSettings(initialHeapSize, maxHeapSize,
-                                stackSize, isServer);
+                printVmSettings(initialHeapSize, maxHeapSize, stackSize);
                 break;
             case "properties":
                 printProperties();
@@ -159,8 +157,7 @@
                 printLocale();
                 break;
             default:
-                printVmSettings(initialHeapSize, maxHeapSize, stackSize,
-                                isServer);
+                printVmSettings(initialHeapSize, maxHeapSize, stackSize);
                 printProperties();
                 printLocale();
                 break;
@@ -172,7 +169,7 @@
      */
     private static void printVmSettings(
             long initialHeapSize, long maxHeapSize,
-            long stackSize, boolean isServer) {
+            long stackSize) {
 
         ostream.println(VM_SETTINGS);
         if (stackSize != 0L) {
@@ -190,8 +187,6 @@
             ostream.println(INDENT + "Max. Heap Size (Estimated): "
                     + SizePrefix.scaleValue(Runtime.getRuntime().maxMemory()));
         }
-        ostream.println(INDENT + "Ergonomics Machine Class: "
-                + ((isServer) ? "server" : "client"));
         ostream.println(INDENT + "Using VM: "
                 + System.getProperty("java.vm.name"));
         ostream.println();
@@ -379,18 +374,6 @@
     }
 
     /**
-     * Appends the vm Ergo message to the header, already created.
-     * initHelpSystem must be called before using this method.
-     */
-    static void appendVmErgoMessage(boolean isServerClass, String vm) {
-        outBuf = outBuf.append(getLocalizedMessage("java.launcher.ergo.message1",
-                vm));
-        outBuf = (isServerClass) ? outBuf.append(",\n")
-                .append(getLocalizedMessage("java.launcher.ergo.message2"))
-                .append("\n\n") : outBuf.append(".\n\n");
-    }
-
-    /**
      * Appends the last invariant part to the previously created messages,
      * and finishes up the printing to the desired output stream.
      * initHelpSystem must be called before using this method.
--- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Tue Nov 22 11:45:55 2016 -0800
@@ -35,9 +35,6 @@
 java.launcher.opt.vmselect   =\    {0}\t  to select the "{1}" VM\n
 java.launcher.opt.hotspot    =\    {0}\t  is a synonym for the "{1}" VM  [deprecated]\n
 
-java.launcher.ergo.message1  =\                  The default VM is {0}
-java.launcher.ergo.message2  =\                  because you are running on a server-class machine.\n
-
 # Translators please note do not translate the options themselves
 java.launcher.opt.footer     =\    -cp <class search path of directories and zip/jar files>\n\
 \    -classpath <class search path of directories and zip/jar files>\n\
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Tue Nov 22 11:45:55 2016 -0800
@@ -740,7 +740,7 @@
                 }
 
                 response = OCSP.check(Collections.singletonList(certId),
-                        responderURI, issuerInfo, responderCert, params.date(),
+                        responderURI, issuerInfo, responderCert, null,
                         ocspExtensions);
             }
         } catch (IOException e) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/RSAClientKeyExchange.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/RSAClientKeyExchange.java	Tue Nov 22 11:45:55 2016 -0800
@@ -257,7 +257,13 @@
 
     @Override
     void print(PrintStream s) throws IOException {
-        s.println("*** ClientKeyExchange, RSA PreMasterSecret, " +
-                                                        protocolVersion);
+        String version = "version not available/extractable";
+
+        byte[] ba = preMaster.getEncoded();
+        if (ba != null && ba.length >= 2) {
+            version = ProtocolVersion.valueOf(ba[0], ba[1]).name;
+        }
+
+        s.println("*** ClientKeyExchange, RSA PreMasterSecret, " + version);
     }
 }
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, 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
@@ -84,8 +84,10 @@
 import sun.security.x509.*;
 
 import static java.security.KeyStore.*;
+import java.security.Security;
 import static sun.security.tools.keytool.Main.Command.*;
 import static sun.security.tools.keytool.Main.Option.*;
+import sun.security.util.DisabledAlgorithmConstraints;
 
 /**
  * This tool manages keystores.
@@ -2428,6 +2430,10 @@
 
     private void doPrintCert(final PrintStream out) throws Exception {
         if (jarfile != null) {
+            // reset "jdk.certpath.disabledAlgorithms" security property
+            // to be able to read jars which were signed with weak algorithms
+            Security.setProperty(DisabledAlgorithmConstraints.PROPERTY_JAR_DISABLED_ALGS, "");
+
             JarFile jf = new JarFile(jarfile, true);
             Enumeration<JarEntry> entries = jf.entries();
             Set<CodeSigner> ss = new HashSet<>();
--- a/jdk/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java	Tue Nov 22 11:45:55 2016 -0800
@@ -46,8 +46,12 @@
     // Get algorithm constraints from the specified security property.
     static String[] getAlgorithms(String propertyName) {
         String property = AccessController.doPrivileged(
-                (PrivilegedAction<String>) () -> Security.getProperty(
-                        propertyName));
+                new PrivilegedAction<String>() {
+                    @Override
+                    public String run() {
+                        return Security.getProperty(propertyName);
+                    }
+                });
 
         String[] algorithmsInProperty = null;
         if (property != null && !property.isEmpty()) {
--- a/jdk/src/java.base/share/classes/sun/security/util/AlgorithmDecomposer.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/util/AlgorithmDecomposer.java	Tue Nov 22 11:45:55 2016 -0800
@@ -34,20 +34,18 @@
  */
 public class AlgorithmDecomposer {
 
-    private static final Pattern transPattern = Pattern.compile("/");
-
     // '(?<!padd)in': match 'in' but not preceded with 'padd'.
-    private static final Pattern pattern =
+    private static final Pattern PATTERN =
             Pattern.compile("with|and|(?<!padd)in", Pattern.CASE_INSENSITIVE);
 
     private static Set<String> decomposeImpl(String algorithm) {
+        Set<String> elements = new HashSet<>();
 
         // algorithm/mode/padding
-        String[] transTockens = transPattern.split(algorithm);
+        String[] transTokens = algorithm.split("/");
 
-        Set<String> elements = new HashSet<>();
-        for (String transTocken : transTockens) {
-            if (transTocken == null || transTocken.length() == 0) {
+        for (String transToken : transTokens) {
+            if (transToken == null || transToken.isEmpty()) {
                 continue;
             }
 
@@ -57,10 +55,10 @@
             // <digest>with<encryption>
             // <digest>with<encryption>and<mgf>
             // <digest>with<encryption>in<format>
-            String[] tokens = pattern.split(transTocken);
+            String[] tokens = PATTERN.split(transToken);
 
             for (String token : tokens) {
-                if (token == null || token.length() == 0) {
+                if (token == null || token.isEmpty()) {
                     continue;
                 }
 
--- a/jdk/src/java.base/share/classes/sun/security/util/AnchorCertificates.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/util/AnchorCertificates.java	Tue Nov 22 11:45:55 2016 -0800
@@ -58,7 +58,7 @@
                 try {
                     cacerts = KeyStore.getInstance("JKS");
                     try (FileInputStream fis = new FileInputStream(f)) {
-                        cacerts.load(fis, "changeit".toCharArray());
+                        cacerts.load(fis, null);
                         certs = new HashSet<>();
                         Enumeration<String> list = cacerts.aliases();
                         String alias;
--- a/jdk/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java	Tue Nov 22 11:45:55 2016 -0800
@@ -39,6 +39,7 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.StringTokenizer;
 import java.util.TimeZone;
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
@@ -240,10 +241,11 @@
 
     private static class Constraints {
         private Map<String, Set<Constraint>> constraintsMap = new HashMap<>();
-        private static final Pattern keySizePattern = Pattern.compile(
-                "keySize\\s*(<=|<|==|!=|>|>=)\\s*(\\d+)");
-        private static final Pattern denyAfterPattern = Pattern.compile(
-                "denyAfter\\s+(\\d{4})-(\\d{2})-(\\d{2})");
+
+        private static class Holder {
+            private static final Pattern DENY_AFTER_PATTERN = Pattern.compile(
+                    "denyAfter\\s+(\\d{4})-(\\d{2})-(\\d{2})");
+        }
 
         public Constraints(String[] constraintArray) {
             for (String constraintEntry : constraintArray) {
@@ -267,9 +269,11 @@
                                     toUpperCase(Locale.ENGLISH));
                     policy = constraintEntry.substring(space + 1);
                 } else {
-                    constraintsMap.computeIfAbsent(
-                            constraintEntry.toUpperCase(Locale.ENGLISH),
-                            k -> new HashSet<>());
+                    algorithm = constraintEntry.toUpperCase(Locale.ENGLISH);
+                    if (!constraintsMap.containsKey(algorithm)) {
+                        constraintsMap.putIfAbsent(algorithm,
+                                new HashSet<>());
+                    }
                     continue;
                 }
 
@@ -283,15 +287,21 @@
                 for (String entry : policy.split("&")) {
                     entry = entry.trim();
 
-                    Matcher matcher = keySizePattern.matcher(entry);
-                    if (matcher.matches()) {
+                    Matcher matcher;
+                    if (entry.startsWith("keySize")) {
                         if (debug != null) {
                             debug.println("Constraints set to keySize: " +
                                     entry);
                         }
+                        StringTokenizer tokens = new StringTokenizer(entry);
+                        if (!"keySize".equals(tokens.nextToken())) {
+                            throw new IllegalArgumentException("Error in " +
+                                    "security property. Constraint unknown: " +
+                                    entry);
+                        }
                         c = new KeySizeConstraint(algorithm,
-                                KeySizeConstraint.Operator.of(matcher.group(1)),
-                                Integer.parseInt(matcher.group(2)));
+                                KeySizeConstraint.Operator.of(tokens.nextToken()),
+                                Integer.parseInt(tokens.nextToken()));
 
                     } else if (entry.equalsIgnoreCase("jdkCA")) {
                         if (debug != null) {
@@ -305,7 +315,9 @@
                         c = new jdkCAConstraint(algorithm);
                         jdkCALimit = true;
 
-                    } else if(matcher.usePattern(denyAfterPattern).matches()) {
+                    } else if(entry.startsWith("denyAfter") &&
+                            (matcher = Holder.DENY_AFTER_PATTERN.matcher(entry))
+                                    .matches()) {
                         if (debug != null) {
                             debug.println("Constraints set to denyAfter");
                         }
--- a/jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java	Tue Nov 22 11:45:55 2016 -0800
@@ -365,7 +365,7 @@
                 continue;
             }
 
-            String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*");
+            String rangeForRegex = range.replace("*", "\\p{Alnum}*");
             while (rangeForRegex.length() > 0) {
                 for (String tag : tags) {
                     tag = tag.toLowerCase(Locale.ROOT);
@@ -399,7 +399,7 @@
                 continue;
             }
 
-            String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*");
+            String rangeForRegex = range.replace("*", "\\p{Alnum}*");
             while (rangeForRegex.length() > 0) {
                 if (tag.matches(rangeForRegex)) {
                     return true;
@@ -447,7 +447,7 @@
     }
 
     public static List<LanguageRange> parse(String ranges) {
-        ranges = ranges.replaceAll(" ", "").toLowerCase(Locale.ROOT);
+        ranges = ranges.replace(" ", "").toLowerCase(Locale.ROOT);
         if (ranges.startsWith("accept-language:")) {
             ranges = ranges.substring(16); // delete unnecessary prefix
         }
@@ -536,6 +536,21 @@
         return list;
     }
 
+    /**
+     * A faster alternative approach to String.replaceFirst(), if the given
+     * string is a literal String, not a regex.
+     */
+    private static String replaceFirstSubStringMatch(String range,
+            String substr, String replacement) {
+        int pos = range.indexOf(substr);
+        if (pos == -1) {
+            return range;
+        } else {
+            return range.substring(0, pos) + replacement
+                    + range.substring(pos + substr.length());
+        }
+    }
+
     private static String[] getEquivalentsForLanguage(String range) {
         String r = range;
 
@@ -544,13 +559,16 @@
                 String equiv = LocaleEquivalentMaps.singleEquivMap.get(r);
                 // Return immediately for performance if the first matching
                 // subtag is found.
-                return new String[] {range.replaceFirst(r, equiv)};
+                return new String[]{replaceFirstSubStringMatch(range,
+                    r, equiv)};
             } else if (LocaleEquivalentMaps.multiEquivsMap.containsKey(r)) {
                 String[] equivs = LocaleEquivalentMaps.multiEquivsMap.get(r);
+                String[] result = new String[equivs.length];
                 for (int i = 0; i < equivs.length; i++) {
-                    equivs[i] = range.replaceFirst(r, equivs[i]);
+                    result[i] = replaceFirstSubStringMatch(range,
+                            r, equivs[i]);
                 }
-                return equivs;
+                return result;
             }
 
             // Truncate the last subtag simply.
@@ -578,7 +596,9 @@
 
                 int len = index + subtag.length();
                 if (range.length() == len || range.charAt(len) == '-') {
-                    return range.replaceFirst(subtag, LocaleEquivalentMaps.regionVariantEquivMap.get(subtag));
+                    return replaceFirstSubStringMatch(range, subtag,
+                            LocaleEquivalentMaps.regionVariantEquivMap
+                                    .get(subtag));
                 }
             }
         }
--- a/jdk/src/java.base/share/lib/security/default.policy	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/lib/security/default.policy	Tue Nov 22 11:45:55 2016 -0800
@@ -181,6 +181,6 @@
 grant codeBase "jrt:/jdk.zipfs" {
     permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete";
     permission java.lang.RuntimePermission "fileSystemProvider";
-    permission java.util.PropertyPermission "*", "read";
+    permission java.util.PropertyPermission "os.name", "read";
 };
 
--- a/jdk/src/java.base/share/native/launcher/defines.h	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/native/launcher/defines.h	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, 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
@@ -70,14 +70,6 @@
 static const jboolean const_cpwildcard = JNI_FALSE;
 #endif /* EXPAND_CLASSPATH_WILDCARDS */
 
-#if defined(NEVER_ACT_AS_SERVER_CLASS_MACHINE)
-static const jint const_ergo_class = NEVER_SERVER_CLASS;
-#elif defined(ALWAYS_ACT_AS_SERVER_CLASS_MACHINE)
-static const jint const_ergo_class = ALWAYS_SERVER_CLASS;
-#else
-static const jint const_ergo_class = DEFAULT_POLICY;
-#endif /* NEVER_ACT_AS_SERVER_CLASS_MACHINE */
-
 #ifdef ENABLE_ARG_FILES
 static const jboolean const_disable_argfile = JNI_FALSE;
 #else
--- a/jdk/src/java.base/share/native/launcher/main.c	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/native/launcher/main.c	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2016, 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
@@ -156,5 +156,5 @@
                    (const_progname != NULL) ? const_progname : *margv,
                    (const_launcher != NULL) ? const_launcher : *margv,
                    HAS_JAVA_ARGS,
-                   const_cpwildcard, const_javaw, const_ergo_class);
+                   const_cpwildcard, const_javaw, 0);
 }
--- a/jdk/src/java.base/share/native/libjava/FileInputStream.c	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/native/libjava/FileInputStream.c	Tue Nov 22 11:45:55 2016 -0800
@@ -73,7 +73,7 @@
 }
 
 JNIEXPORT jlong JNICALL
-Java_java_io_FileInputStream_skip(JNIEnv *env, jobject this, jlong toSkip) {
+Java_java_io_FileInputStream_skip0(JNIEnv *env, jobject this, jlong toSkip) {
     jlong cur = jlong_zero;
     jlong end = jlong_zero;
     FD fd = GET_FD(this, fis_fd);
@@ -90,7 +90,7 @@
 }
 
 JNIEXPORT jint JNICALL
-Java_java_io_FileInputStream_available(JNIEnv *env, jobject this) {
+Java_java_io_FileInputStream_available0(JNIEnv *env, jobject this) {
     jlong ret;
     FD fd = GET_FD(this, fis_fd);
     if (fd == -1) {
--- a/jdk/src/java.base/share/native/libjli/java.c	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/native/libjli/java.c	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2016, 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
@@ -78,7 +78,6 @@
 static jboolean _have_classpath = JNI_FALSE;
 static const char *_fVersion;
 static jboolean _wc_enabled = JNI_FALSE;
-static jint _ergo_policy = DEFAULT_POLICY;
 
 /*
  * Entries for splash screen environment variables.
@@ -218,7 +217,7 @@
         jboolean javaargs,                      /* JAVA_ARGS */
         jboolean cpwildcard,                    /* classpath wildcard*/
         jboolean javaw,                         /* windows-only javaw */
-        jint ergo                               /* ergonomics class policy */
+        jint ergo                               /* unused */
 )
 {
     int mode = LM_UNKNOWN;
@@ -236,7 +235,6 @@
     _program_name = pname;
     _is_java_args = javaargs;
     _wc_enabled = cpwildcard;
-    _ergo_policy = ergo;
 
     InitLauncher(javaw);
     DumpState();
@@ -431,7 +429,7 @@
         LEAVE();
     }
 
-    FreeKnownVMs();  /* after last possible PrintUsage() */
+    FreeKnownVMs(); /* after last possible PrintUsage */
 
     if (JLI_IsTraceLauncher()) {
         end = CounterGet();
@@ -669,11 +667,6 @@
     /* use the default VM type if not specified (no alias processing) */
     if (jvmtype == NULL) {
       char* result = knownVMs[0].name+1;
-      /* Use a different VM type if we are on a server class machine? */
-      if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) &&
-          (ServerClassMachine() == JNI_TRUE)) {
-        result = knownVMs[0].server_class+1;
-      }
       JLI_TraceLauncher("Default VM: %s\n", result);
       return result;
     }
@@ -1777,15 +1770,14 @@
     jclass cls = GetLauncherHelperClass(env);
     NULL_CHECK(cls);
     NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls,
-            "showSettings", "(ZLjava/lang/String;JJJZ)V"));
+            "showSettings", "(ZLjava/lang/String;JJJ)V"));
     NULL_CHECK(joptString = (*env)->NewStringUTF(env, optString));
     (*env)->CallStaticVoidMethod(env, cls, showSettingsID,
                                  USE_STDERR,
                                  joptString,
                                  (jlong)initialHeapSize,
                                  (jlong)maxHeapSize,
-                                 (jlong)threadStackSize,
-                                 ServerClassMachine());
+                                 (jlong)threadStackSize);
 }
 
 /**
@@ -1812,7 +1804,7 @@
 static void
 PrintUsage(JNIEnv* env, jboolean doXUsage)
 {
-  jmethodID initHelp, vmSelect, vmSynonym, vmErgo, printHelp, printXUsageMessage;
+  jmethodID initHelp, vmSelect, vmSynonym, printHelp, printXUsageMessage;
   jstring jprogname, vm1, vm2;
   int i;
   jclass cls = GetLauncherHelperClass(env);
@@ -1831,8 +1823,6 @@
     NULL_CHECK(vmSynonym = (*env)->GetStaticMethodID(env, cls,
                                         "appendVmSynonymMessage",
                                         "(Ljava/lang/String;Ljava/lang/String;)V"));
-    NULL_CHECK(vmErgo = (*env)->GetStaticMethodID(env, cls,
-                                        "appendVmErgoMessage", "(ZLjava/lang/String;)V"));
 
     NULL_CHECK(printHelp = (*env)->GetStaticMethodID(env, cls,
                                         "printHelpMessage", "(Z)V"));
@@ -1845,13 +1835,6 @@
 
 
     /* Assemble the other variant part of the usage */
-    if ((knownVMs[0].flag == VM_KNOWN) ||
-        (knownVMs[0].flag == VM_IF_SERVER_CLASS)) {
-      NULL_CHECK(vm1 = (*env)->NewStringUTF(env, knownVMs[0].name));
-      NULL_CHECK(vm2 =  (*env)->NewStringUTF(env, knownVMs[0].name+1));
-      (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
-      CHECK_EXCEPTION_RETURN();
-    }
     for (i=1; i<knownVMsCount; i++) {
       if (knownVMs[i].flag == VM_KNOWN) {
         NULL_CHECK(vm1 =  (*env)->NewStringUTF(env, knownVMs[i].name));
@@ -1869,20 +1852,6 @@
       }
     }
 
-    /* The first known VM is the default */
-    {
-      jboolean isServerClassMachine = ServerClassMachine();
-
-      const char* defaultVM  =  knownVMs[0].name+1;
-      if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) && isServerClassMachine) {
-        defaultVM = knownVMs[0].server_class+1;
-      }
-
-      NULL_CHECK(vm1 =  (*env)->NewStringUTF(env, defaultVM));
-      (*env)->CallStaticVoidMethod(env, cls, vmErgo, isServerClassMachine,  vm1);
-      CHECK_EXCEPTION_RETURN();
-    }
-
     /* Complete the usage message and print to stderr*/
     (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR);
   }
@@ -2011,19 +1980,7 @@
                 } else if (!JLI_StrCCmp(tmpPtr, "ERROR")) {
                     vmType = VM_ERROR;
                 } else if (!JLI_StrCCmp(tmpPtr, "IF_SERVER_CLASS")) {
-                    tmpPtr += JLI_StrCSpn(tmpPtr, whiteSpace);
-                    if (*tmpPtr != 0) {
-                        tmpPtr += JLI_StrSpn(tmpPtr, whiteSpace);
-                    }
-                    if (*tmpPtr == 0) {
-                        JLI_ReportErrorMessage(CFG_WARN4, lineno, jvmCfgName);
-                    } else {
-                        /* Null terminate server class VM name */
-                        serverClassVMName = tmpPtr;
-                        tmpPtr += JLI_StrCSpn(tmpPtr, whiteSpace);
-                        *tmpPtr = 0;
-                        vmType = VM_IF_SERVER_CLASS;
-                    }
+                    /* ignored */
                 } else {
                     JLI_ReportErrorMessage(CFG_WARN5, lineno, &jvmCfgName[0]);
                     vmType = VM_KNOWN;
@@ -2043,11 +2000,6 @@
                 JLI_TraceLauncher("    name: %s  vmType: %s  alias: %s\n",
                    knownVMs[cnt].name, "VM_ALIASED_TO", knownVMs[cnt].alias);
                 break;
-            case VM_IF_SERVER_CLASS:
-                knownVMs[cnt].server_class = JLI_StringDup(serverClassVMName);
-                JLI_TraceLauncher("    name: %s  vmType: %s  server_class: %s\n",
-                    knownVMs[cnt].name, "VM_IF_SERVER_CLASS", knownVMs[cnt].server_class);
-                break;
             }
             cnt++;
         }
@@ -2197,12 +2149,6 @@
     return _launcher_name;
 }
 
-jint
-GetErgoPolicy()
-{
-    return _ergo_policy;
-}
-
 jboolean
 IsJavaArgs()
 {
@@ -2267,17 +2213,6 @@
     printf("\tlauncher name:%s\n", GetLauncherName());
     printf("\tjavaw:%s\n", (IsJavaw() == JNI_TRUE) ? "on" : "off");
     printf("\tfullversion:%s\n", GetFullVersion());
-    printf("\tergo_policy:");
-    switch(GetErgoPolicy()) {
-        case NEVER_SERVER_CLASS:
-            printf("NEVER_ACT_AS_A_SERVER_CLASS_MACHINE\n");
-            break;
-        case ALWAYS_SERVER_CLASS:
-            printf("ALWAYS_ACT_AS_A_SERVER_CLASS_MACHINE\n");
-            break;
-        default:
-            printf("DEFAULT_ERGONOMICS_POLICY\n");
-    }
 }
 
 /*
--- a/jdk/src/java.base/share/native/libjli/java.h	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/share/native/libjli/java.h	Tue Nov 22 11:45:55 2016 -0800
@@ -166,19 +166,10 @@
 void AddOption(char *str, void *info);
 jboolean IsWhiteSpaceOption(const char* name);
 
-enum ergo_policy {
-   DEFAULT_POLICY = 0,
-   NEVER_SERVER_CLASS,
-   ALWAYS_SERVER_CLASS
-};
-
 const char* GetProgramName();
 const char* GetFullVersion();
 jboolean IsJavaArgs();
 jboolean IsJavaw();
-jint GetErgoPolicy();
-
-jboolean ServerClassMachine();
 
 int ContinueInNewThread(InvocationFunctions* ifn, jlong threadStackSize,
                    int argc, char** argv,
--- a/jdk/src/java.base/unix/conf/aarch64/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/aarch64/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -21,10 +21,9 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-# 
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/amd64/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/amd64/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -21,10 +21,9 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-# 
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/i586/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/i586/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -23,13 +23,13 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
 # "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
 # and may not be available in a future release.
 #
--client IF_SERVER_CLASS -server
 -server KNOWN
+-client KNOWN
 -minimal KNOWN
--- a/jdk/src/java.base/unix/conf/ia64/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/ia64/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -1,6 +1,3 @@
-#
-# 
-# 
 # Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
@@ -24,11 +21,9 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-#
-#
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/ppc64/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/ppc64/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -23,7 +23,7 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/ppc64le/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/ppc64le/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -23,7 +23,7 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/s390x/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/s390x/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -23,7 +23,7 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/sparc/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/sparc/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -1,4 +1,4 @@
-# Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2001, 2016, 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,13 +23,13 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
 # "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
 # and may not be available in a future release.
 #
--client IF_SERVER_CLASS -server
 -server KNOWN
+-client KNOWN
 -minimal KNOWN
--- a/jdk/src/java.base/unix/conf/sparcv9/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/sparcv9/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -23,7 +23,7 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/zero/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/unix/conf/zero/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -21,10 +21,9 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-# 
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/native/libjli/ergo.c	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 1998, 2011, 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.
- */
-
-/* This file houses the common methods for VM ergonomics the platforms
- * are split into ergo_sparc and ergo_x86, and they could be split more
- * in the future if required. The following comments are not entirely
- * true after bifurcation of the platform specific files.
- */
-
-/*
- * The following methods (down to ServerClassMachine()) answer
- * the question about whether a machine is a "server-class"
- * machine.  A server-class machine is loosely defined as one
- * with 2 or more processors and 2 gigabytes or more physical
- * memory.  The definition of a processor is a physical package,
- * not a hyperthreaded chip masquerading as a multi-processor.
- * The definition of memory is also somewhat fuzzy, since x86
- * machines seem not to report all the memory in their DIMMs, we
- * think because of memory mapping of graphics cards, etc.
- *
- * This code is somewhat more confused with #ifdef's than we'd
- * like because this file is used by both Solaris and Linux
- * platforms, and so needs to be parameterized for SPARC and
- * i586 hardware.  The other Linux platforms (amd64 and ia64)
- * don't even ask this question, because they only come with
- * server JVMs.
- */
-
-#include "ergo.h"
-
-/* Dispatch to the platform-specific definition of "server-class" */
-jboolean
-ServerClassMachine(void) {
-  jboolean result;
-  switch(GetErgoPolicy()) {
-    case NEVER_SERVER_CLASS:
-      return JNI_FALSE;
-    case ALWAYS_SERVER_CLASS:
-      return JNI_TRUE;
-    default:
-      result = ServerClassMachineImpl();
-      JLI_TraceLauncher("ServerClassMachine: returns default value of %s\n",
-           (result == JNI_TRUE ? "true" : "false"));
-      return result;
-  }
-}
-
-#ifdef USE_GENERIC_ERGO
-/* Ask the OS how many processors there are. */
-static unsigned long
-physical_processors(void) {
-  const unsigned long sys_processors = sysconf(_SC_NPROCESSORS_CONF);
-  JLI_TraceLauncher("sysconf(_SC_NPROCESSORS_CONF): %lu\n", sys_processors);
-  return sys_processors;
-}
-
-jboolean
-ServerClassMachineImpl(void) {
-  jboolean            result            = JNI_FALSE;
-  /* How big is a server class machine? */
-  const unsigned long server_processors = 2UL;
-  const uint64_t      server_memory     = 2UL * GB;
-  const uint64_t      actual_memory     = physical_memory();
-
-  /* Is this a server class machine? */
-  if (actual_memory >= server_memory) {
-    const unsigned long actual_processors = physical_processors();
-    if (actual_processors >= server_processors) {
-      result = JNI_TRUE;
-    }
-  }
-  JLI_TraceLauncher("unix_" LIBARCHNAME "_ServerClassMachine: %s\n",
-           (result == JNI_TRUE ? "JNI_TRUE" : "JNI_FALSE"));
-  return result;
-}
-#endif
-
-/* Compute physical memory by asking the OS */
-uint64_t
-physical_memory(void) {
-  const uint64_t pages     = (uint64_t) sysconf(_SC_PHYS_PAGES);
-  const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE);
-  const uint64_t result    = pages * page_size;
-# define UINT64_FORMAT "%" PRIu64
-
-  JLI_TraceLauncher("pages: " UINT64_FORMAT
-          "  page_size: " UINT64_FORMAT
-          "  physical memory: " UINT64_FORMAT " (%.3fGB)\n",
-           pages, page_size, result, result / (double) GB);
-  return result;
-}
--- a/jdk/src/java.base/unix/native/libjli/ergo.h	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 1998, 2005, 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.
- */
-
-#ifndef _ERGO_H
-#define _ERGO_H
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/types.h>
-
-#include "java.h"
-
-jboolean ServerClassMachineImpl(void);
-uint64_t physical_memory(void);
-
-#endif /* _ERGO_H */
--- a/jdk/src/java.base/unix/native/libjli/ergo_i586.c	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,323 +0,0 @@
-/*
- * Copyright (c) 1998, 2007, 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.
- */
-
-#include "ergo.h"
-
-static unsigned long physical_processors(void);
-
-#ifdef __solaris__
-
-/*
- * A utility method for asking the CPU about itself.
- * There's a corresponding version of linux-i586
- * because the compilers are different.
- */
-static void
-get_cpuid(uint32_t arg,
-          uint32_t* eaxp,
-          uint32_t* ebxp,
-          uint32_t* ecxp,
-          uint32_t* edxp) {
-#ifdef _LP64
-  asm(
-  /* rbx is a callee-saved register */
-      " movq    %rbx, %r11  \n"
-  /* rdx and rcx are 3rd and 4th argument registers */
-      " movq    %rdx, %r10  \n"
-      " movq    %rcx, %r9   \n"
-      " movl    %edi, %eax  \n"
-      " cpuid               \n"
-      " movl    %eax, (%rsi)\n"
-      " movl    %ebx, (%r10)\n"
-      " movl    %ecx, (%r9) \n"
-      " movl    %edx, (%r8) \n"
-  /* Restore rbx */
-      " movq    %r11, %rbx");
-#else
-  /* EBX is a callee-saved register */
-  asm(" pushl   %ebx");
-  /* Need ESI for storing through arguments */
-  asm(" pushl   %esi");
-  asm(" movl    8(%ebp), %eax   \n"
-      " cpuid                   \n"
-      " movl    12(%ebp), %esi  \n"
-      " movl    %eax, (%esi)    \n"
-      " movl    16(%ebp), %esi  \n"
-      " movl    %ebx, (%esi)    \n"
-      " movl    20(%ebp), %esi  \n"
-      " movl    %ecx, (%esi)    \n"
-      " movl    24(%ebp), %esi  \n"
-      " movl    %edx, (%esi)      ");
-  /* Restore ESI and EBX */
-  asm(" popl    %esi");
-  /* Restore EBX */
-  asm(" popl    %ebx");
-#endif /* LP64 */
-}
-
-/* The definition of a server-class machine for solaris-i586/amd64 */
-jboolean
-ServerClassMachineImpl(void) {
-  jboolean            result            = JNI_FALSE;
-  /* How big is a server class machine? */
-  const unsigned long server_processors = 2UL;
-  const uint64_t      server_memory     = 2UL * GB;
-  /*
-   * We seem not to get our full complement of memory.
-   *     We allow some part (1/8?) of the memory to be "missing",
-   *     based on the sizes of DIMMs, and maybe graphics cards.
-   */
-  const uint64_t      missing_memory    = 256UL * MB;
-  const uint64_t      actual_memory     = physical_memory();
-
-  /* Is this a server class machine? */
-  if (actual_memory >= (server_memory - missing_memory)) {
-    const unsigned long actual_processors = physical_processors();
-    if (actual_processors >= server_processors) {
-      result = JNI_TRUE;
-    }
-  }
-  JLI_TraceLauncher("solaris_" LIBARCHNAME "_ServerClassMachine: %s\n",
-           (result == JNI_TRUE ? "true" : "false"));
-  return result;
-}
-
-#endif /* __solaris__ */
-
-#ifdef __linux__
-
-/*
- * A utility method for asking the CPU about itself.
- * There's a corresponding version of solaris-i586
- * because the compilers are different.
- */
-static void
-get_cpuid(uint32_t arg,
-          uint32_t* eaxp,
-          uint32_t* ebxp,
-          uint32_t* ecxp,
-          uint32_t* edxp) {
-#ifdef _LP64
-  __asm__ volatile (/* Instructions */
-                    "   movl    %4, %%eax  \n"
-                    "   cpuid              \n"
-                    "   movl    %%eax, (%0)\n"
-                    "   movl    %%ebx, (%1)\n"
-                    "   movl    %%ecx, (%2)\n"
-                    "   movl    %%edx, (%3)\n"
-                    : /* Outputs */
-                    : /* Inputs */
-                    "r" (eaxp),
-                    "r" (ebxp),
-                    "r" (ecxp),
-                    "r" (edxp),
-                    "r" (arg)
-                    : /* Clobbers */
-                    "%rax", "%rbx", "%rcx", "%rdx", "memory"
-                    );
-#else /* _LP64 */
-  uint32_t value_of_eax = 0;
-  uint32_t value_of_ebx = 0;
-  uint32_t value_of_ecx = 0;
-  uint32_t value_of_edx = 0;
-  __asm__ volatile (/* Instructions */
-                        /* ebx is callee-save, so push it */
-                    "   pushl   %%ebx      \n"
-                    "   movl    %4, %%eax  \n"
-                    "   cpuid              \n"
-                    "   movl    %%eax, %0  \n"
-                    "   movl    %%ebx, %1  \n"
-                    "   movl    %%ecx, %2  \n"
-                    "   movl    %%edx, %3  \n"
-                        /* restore ebx */
-                    "   popl    %%ebx      \n"
-
-                    : /* Outputs */
-                    "=m" (value_of_eax),
-                    "=m" (value_of_ebx),
-                    "=m" (value_of_ecx),
-                    "=m" (value_of_edx)
-                    : /* Inputs */
-                    "m" (arg)
-                    : /* Clobbers */
-                    "%eax", "%ecx", "%edx"
-                    );
-  *eaxp = value_of_eax;
-  *ebxp = value_of_ebx;
-  *ecxp = value_of_ecx;
-  *edxp = value_of_edx;
-#endif /* _LP64 */
-}
-
-/* The definition of a server-class machine for linux-i586 */
-jboolean
-ServerClassMachineImpl(void) {
-  jboolean            result            = JNI_FALSE;
-  /* How big is a server class machine? */
-  const unsigned long server_processors = 2UL;
-  const uint64_t      server_memory     = 2UL * GB;
-  /*
-   * We seem not to get our full complement of memory.
-   *     We allow some part (1/8?) of the memory to be "missing",
-   *     based on the sizes of DIMMs, and maybe graphics cards.
-   */
-  const uint64_t      missing_memory    = 256UL * MB;
-  const uint64_t      actual_memory     = physical_memory();
-
-  /* Is this a server class machine? */
-  if (actual_memory >= (server_memory - missing_memory)) {
-    const unsigned long actual_processors = physical_processors();
-    if (actual_processors >= server_processors) {
-      result = JNI_TRUE;
-    }
-  }
-  JLI_TraceLauncher("linux_" LIBARCHNAME "_ServerClassMachine: %s\n",
-           (result == JNI_TRUE ? "true" : "false"));
-  return result;
-}
-#endif /* __linux__ */
-
-/*
- * Routines shared by solaris-i586 and linux-i586.
- */
-
-enum HyperThreadingSupport_enum {
-  hts_supported        =  1,
-  hts_too_soon_to_tell =  0,
-  hts_not_supported    = -1,
-  hts_not_pentium4     = -2,
-  hts_not_intel        = -3
-};
-typedef enum HyperThreadingSupport_enum HyperThreadingSupport;
-
-/* Determine if hyperthreading is supported */
-static HyperThreadingSupport
-hyperthreading_support(void) {
-  HyperThreadingSupport result = hts_too_soon_to_tell;
-  /* Bits 11 through 8 is family processor id */
-# define FAMILY_ID_SHIFT 8
-# define FAMILY_ID_MASK 0xf
-  /* Bits 23 through 20 is extended family processor id */
-# define EXT_FAMILY_ID_SHIFT 20
-# define EXT_FAMILY_ID_MASK 0xf
-  /* Pentium 4 family processor id */
-# define PENTIUM4_FAMILY_ID 0xf
-  /* Bit 28 indicates Hyper-Threading Technology support */
-# define HT_BIT_SHIFT 28
-# define HT_BIT_MASK 1
-  uint32_t vendor_id[3] = { 0U, 0U, 0U };
-  uint32_t value_of_eax = 0U;
-  uint32_t value_of_edx = 0U;
-  uint32_t dummy        = 0U;
-
-  /* Yes, this is supposed to be [0], [2], [1] */
-  get_cpuid(0, &dummy, &vendor_id[0], &vendor_id[2], &vendor_id[1]);
-  JLI_TraceLauncher("vendor: %c %c %c %c %c %c %c %c %c %c %c %c \n",
-           ((vendor_id[0] >>  0) & 0xff),
-           ((vendor_id[0] >>  8) & 0xff),
-           ((vendor_id[0] >> 16) & 0xff),
-           ((vendor_id[0] >> 24) & 0xff),
-           ((vendor_id[1] >>  0) & 0xff),
-           ((vendor_id[1] >>  8) & 0xff),
-           ((vendor_id[1] >> 16) & 0xff),
-           ((vendor_id[1] >> 24) & 0xff),
-           ((vendor_id[2] >>  0) & 0xff),
-           ((vendor_id[2] >>  8) & 0xff),
-           ((vendor_id[2] >> 16) & 0xff),
-           ((vendor_id[2] >> 24) & 0xff));
-  get_cpuid(1, &value_of_eax, &dummy, &dummy, &value_of_edx);
-  JLI_TraceLauncher("value_of_eax: 0x%x  value_of_edx: 0x%x\n",
-           value_of_eax, value_of_edx);
-  if ((((value_of_eax >> FAMILY_ID_SHIFT) & FAMILY_ID_MASK) == PENTIUM4_FAMILY_ID) ||
-      (((value_of_eax >> EXT_FAMILY_ID_SHIFT) & EXT_FAMILY_ID_MASK) != 0)) {
-    if ((((vendor_id[0] >>  0) & 0xff) == 'G') &&
-        (((vendor_id[0] >>  8) & 0xff) == 'e') &&
-        (((vendor_id[0] >> 16) & 0xff) == 'n') &&
-        (((vendor_id[0] >> 24) & 0xff) == 'u') &&
-        (((vendor_id[1] >>  0) & 0xff) == 'i') &&
-        (((vendor_id[1] >>  8) & 0xff) == 'n') &&
-        (((vendor_id[1] >> 16) & 0xff) == 'e') &&
-        (((vendor_id[1] >> 24) & 0xff) == 'I') &&
-        (((vendor_id[2] >>  0) & 0xff) == 'n') &&
-        (((vendor_id[2] >>  8) & 0xff) == 't') &&
-        (((vendor_id[2] >> 16) & 0xff) == 'e') &&
-        (((vendor_id[2] >> 24) & 0xff) == 'l')) {
-      if (((value_of_edx >> HT_BIT_SHIFT) & HT_BIT_MASK) == HT_BIT_MASK) {
-        JLI_TraceLauncher("Hyperthreading supported\n");
-        result = hts_supported;
-      } else {
-        JLI_TraceLauncher("Hyperthreading not supported\n");
-        result = hts_not_supported;
-      }
-    } else {
-      JLI_TraceLauncher("Not GenuineIntel\n");
-      result = hts_not_intel;
-    }
-  } else {
-    JLI_TraceLauncher("not Pentium 4 or extended\n");
-    result = hts_not_pentium4;
-  }
-  return result;
-}
-
-/* Determine how many logical processors there are per CPU */
-static unsigned int
-logical_processors_per_package(void) {
-  /*
-   * After CPUID with EAX==1, register EBX bits 23 through 16
-   * indicate the number of logical processors per package
-   */
-# define NUM_LOGICAL_SHIFT 16
-# define NUM_LOGICAL_MASK 0xff
-  unsigned int result                        = 1U;
-  const HyperThreadingSupport hyperthreading = hyperthreading_support();
-
-  if (hyperthreading == hts_supported) {
-    uint32_t value_of_ebx = 0U;
-    uint32_t dummy        = 0U;
-
-    get_cpuid(1, &dummy, &value_of_ebx, &dummy, &dummy);
-    result = (value_of_ebx >> NUM_LOGICAL_SHIFT) & NUM_LOGICAL_MASK;
-    JLI_TraceLauncher("logical processors per package: %u\n", result);
-  }
-  return result;
-}
-
-/* Compute the number of physical processors, not logical processors */
-static unsigned long
-physical_processors(void) {
-  const long sys_processors = sysconf(_SC_NPROCESSORS_CONF);
-  unsigned long result      = sys_processors;
-
-  JLI_TraceLauncher("sysconf(_SC_NPROCESSORS_CONF): %lu\n", sys_processors);
-  if (sys_processors > 1) {
-    unsigned int logical_processors = logical_processors_per_package();
-    if (logical_processors > 1) {
-      result = (unsigned long) sys_processors / logical_processors;
-    }
-  }
-  JLI_TraceLauncher("physical processors: %lu\n", result);
-  return result;
-}
--- a/jdk/src/java.base/windows/conf/amd64/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/windows/conf/amd64/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -1,6 +1,3 @@
-#
-# 
-# 
 # Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
@@ -27,7 +24,7 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/windows/conf/i586/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/windows/conf/i586/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -23,7 +23,7 @@
 #
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/windows/conf/ia64/jvm.cfg	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/windows/conf/ia64/jvm.cfg	Tue Nov 22 11:45:55 2016 -0800
@@ -1,6 +1,3 @@
-#
-# 
-# 
 # Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
@@ -24,10 +21,9 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-#
 # List of JVMs that can be used as an option to java, javac, etc.
 # Order is important -- first in this list is the default JVM.
-# NOTE that this both this file and its format are UNSUPPORTED and
+# NOTE that both this file and its format are UNSUPPORTED and
 # WILL GO AWAY in a future release.
 #
 # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/windows/native/libjli/java_md.c	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/java.base/windows/native/libjli/java_md.c	Tue Nov 22 11:45:55 2016 -0800
@@ -639,11 +639,6 @@
     }
 }
 
-jboolean
-ServerClassMachine() {
-    return (GetErgoPolicy() == ALWAYS_SERVER_CLASS) ? JNI_TRUE : JNI_FALSE;
-}
-
 /*
  * Wrapper for platform dependent unsetenv function.
  */
--- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java	Tue Nov 22 11:45:55 2016 -0800
@@ -3222,7 +3222,7 @@
     }
     //where:
         private Pattern CURSOR_COLUMN_PATTERN =
-                Pattern.compile("(?<prefix>.*)\033\\[[0-9]+;(?<column>[0-9]+)R");
+                Pattern.compile("(?<prefix>.*)\033\\[[0-9]+;(?<column>[0-9]+)R", Pattern.DOTALL);
 
     /**
      * Read a line for unsupported terminals.
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties	Tue Nov 22 11:45:55 2016 -0800
@@ -71,9 +71,7 @@
 \ separated list of elements each using one the following forms:\n\
 \  <glob-pattern>\n\
 \  glob:<glob-pattern>\n\
-\  regex:<regex-pattern>\n\
-\  @<filename> where filename is the name of a file containing patterns to be\
-\ used, one pattern per line\n\
+\  regex:<regex-pattern>
 
 
 main.opt.full-version=\
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java	Tue Nov 22 11:45:55 2016 -0800
@@ -92,7 +92,7 @@
     public DirArchive(Path dirPath, Consumer<String> log) {
         Objects.requireNonNull(dirPath);
         if (!Files.isDirectory(dirPath)) {
-            throw new IllegalArgumentException("Not a directory");
+            throw new IllegalArgumentException(dirPath + " is not a directory");
         }
         chop = dirPath.toString().length() + 1;
         this.moduleName = Objects.requireNonNull(dirPath.getFileName()).toString();
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Tue Nov 22 11:45:55 2016 -0800
@@ -212,7 +212,7 @@
             mainOptions.add(new PlugOption(true, (task, opt, arg) -> {
                 Path path = Paths.get(arg);
                 if (!Files.exists(path) || !Files.isDirectory(path)) {
-                    throw newBadArgs("err.image.must.exist");
+                    throw newBadArgs("err.image.must.exist", path);
                 }
                 existingImage = path.toAbsolutePath();
             }, true, POST_PROCESS));
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Tue Nov 22 11:45:55 2016 -0800
@@ -91,7 +91,7 @@
 err.mods.must.be.specified:no modules specified to {0}
 err.path.not.found=path not found: {0}
 err.path.not.valid=invalid path: {0}
-err.image.must.exist=image does not exist or is not a directory
+err.image.must.exist=image {0} does not exist or is not a directory
 err.existing.image.invalid=existing image is not valid
 err.file.not.found=cannot find file: {0}
 err.file.error=cannot access file: {0}
--- a/jdk/test/TEST.ROOT	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/TEST.ROOT	Tue Nov 22 11:45:55 2016 -0800
@@ -18,7 +18,7 @@
 othervm.dirs=java/awt java/beans javax/accessibility javax/imageio javax/sound javax/print javax/management com/sun/awt sun/awt sun/java2d sun/pisces javax/xml/jaxp/testng/validation java/lang/ProcessHandle
 
 # Tests that cannot run concurrently
-exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi java/util/stream javax/rmi
+exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi java/util/stream javax/rmi com/sun/corba/cachedSocket
 
 # Group definitions
 groups=TEST.groups [closed/TEST.groups]
--- a/jdk/test/com/sun/net/httpserver/TEST.properties	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/com/sun/net/httpserver/TEST.properties	Tue Nov 22 11:45:55 2016 -0800
@@ -1,1 +1,1 @@
-modules = jdk.httpserver
\ No newline at end of file
+modules = jdk.httpserver java.logging
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Locale/Bug8166994.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2016, 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 8166884
+ * @summary Checks the subsequent call to parse the same language ranges
+ *          which must generate the same list of language ranges
+ *          i.e. the priority list containing equivalents, as in the
+ *          first call
+ */
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.stream.Collectors;
+
+public class Bug8166994 {
+
+    public static void main(String[] args) {
+        List<String> list = Arrays.asList("ccq-aa", "ybd-aa", "rki-aa");
+        String ranges = "ccq-aa";
+        testParseConsistency(list, ranges);
+
+        // consecutive call to check the language range parse consistency
+        testParseConsistency(list, ranges);
+
+        // another case with ranges consisting of multiple equivalents and
+        // single equivalents
+        list = Arrays.asList("gfx-xz", "oun-xz", "mwj-xz", "vaj-xz",
+                "taj-xy", "tsf-xy");
+        ranges = "gfx-xz, taj-xy";
+        testParseConsistency(list, ranges);
+        // consecutive call to check the language range parse consistency
+        testParseConsistency(list, ranges);
+
+    }
+
+    private static void testParseConsistency(List<String> list, String ranges) {
+        List<String> priorityList = parseRanges(ranges);
+        if (!list.equals(priorityList)) {
+            throw new RuntimeException("Failed to parse the language range ["
+                    + ranges + "], Expected: " + list + " Found: "
+                    + priorityList);
+        }
+    }
+
+    private static List<String> parseRanges(String s) {
+        return Locale.LanguageRange.parse(s).stream()
+                .map(Locale.LanguageRange::getRange)
+                .collect(Collectors.toList());
+    }
+
+}
+
--- a/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java	Tue Nov 22 11:45:55 2016 -0800
@@ -176,7 +176,10 @@
                         boolean finished = onReceiveTimeout(
                                 engine, peerAddr, side, packets);
 
+                        log(side, "Reproduced " + packets.size() + " packets");
                         for (DatagramPacket p : packets) {
+                            printHex("Reproduced packet",
+                                p.getData(), p.getOffset(), p.getLength());
                             socket.send(p);
                         }
 
@@ -334,7 +337,7 @@
             String side, List<DatagramPacket> packets) throws Exception {
 
         boolean endLoops = false;
-        int loops = MAX_HANDSHAKE_LOOPS;
+        int loops = MAX_HANDSHAKE_LOOPS / 2;
         while (!endLoops &&
                 (serverException == null) && (clientException == null)) {
 
@@ -350,7 +353,8 @@
 
             SSLEngineResult.Status rs = r.getStatus();
             SSLEngineResult.HandshakeStatus hs = r.getHandshakeStatus();
-            log(side, "====packet(" + loops + ", " + rs + ", " + hs + ")====");
+            log(side, "----produce handshake packet(" +
+                    loops + ", " + rs + ", " + hs + ")----");
             if (rs == SSLEngineResult.Status.BUFFER_OVERFLOW) {
                 // the client maximum fragment size config does not work?
                 throw new Exception("Buffer overflow: " +
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/interop/ClientHelloChromeInterOp.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+//
+// SunJSSE does not support dynamic system properties, no way to re-use
+// system properties in samevm/agentvm mode.
+//
+
+/*
+ * @test
+ * @bug 8169362
+ * @summary Interop automated testing with Chrome
+ * @modules java.base/sun.security.util
+ * @run main/othervm ClientHelloChromeInterOp
+ */
+
+import java.util.Base64;
+import sun.security.util.HexDumpEncoder;
+
+public class ClientHelloChromeInterOp extends ClientHelloInterOp {
+    // The ClientHello message.
+    //
+    // Captured from Chrome browser (version 54.0.2840.87 m (64-bit)) on
+    // Windows 10.
+    private final static String ClientHelloMsg =
+        "FgMBAL4BAAC6AwOWBEueOntnurZ+WAW0D9Qn2HpdzXLu0MgDjsD9e5JU6AAAIsA\n" +
+        "rwC/ALMAwzKnMqMwUzBPACcATwArAFACcAJ0ALwA1AAoBAABv/wEAAQAAAAATAB\n" +
+        "EAAA53d3cub3JhY2xlLmNvbQAXAAAAIwAAAA0AEgAQBgEGAwUBBQMEAQQDAgECA\n" +
+        "wAFAAUBAAAAAAASAAAAEAAOAAwCaDIIaHR0cC8xLjF1UAAAAAsAAgEAAAoACAAG\n" +
+        "AB0AFwAY";
+
+    /*
+     * Main entry point for this test.
+     */
+    public static void main(String args[]) throws Exception {
+        (new ClientHelloChromeInterOp()).run();
+    }
+
+    @Override
+    protected byte[] createClientHelloMessage() {
+        byte[] bytes = Base64.getMimeDecoder().decode(ClientHelloMsg);
+
+        // Dump the hex codes of the ClientHello message so that developers
+        // can easily check whether the message is captured correct or not.
+        HexDumpEncoder dump = new HexDumpEncoder();
+        System.out.println("The ClientHello message used");
+        try {
+            dump.encodeBuffer(bytes, System.out);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        return bytes;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/interop/ClientHelloInterOp.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,432 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+import javax.net.ssl.*;
+import javax.net.ssl.SSLEngineResult.*;
+import java.io.*;
+import java.nio.*;
+import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.security.KeyFactory;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.spec.*;
+import java.util.Base64;
+
+public abstract class ClientHelloInterOp {
+
+    /*
+     * Certificates and keys used in the test.
+     */
+    // Trusted certificates.
+    private final static String[] trustedCertStrs = {
+        // SHA256withECDSA, curve prime256v1
+        // Validity
+        //     Not Before: Nov  9 03:24:05 2016 GMT
+        //     Not After : Oct 20 03:24:05 2037 GMT
+        "-----BEGIN CERTIFICATE-----\n" +
+        "MIICHDCCAcGgAwIBAgIJAM83C/MVp9F5MAoGCCqGSM49BAMCMDsxCzAJBgNVBAYT\n" +
+        "AlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZj\n" +
+        "ZTAeFw0xNjExMDkwMzI0MDVaFw0zNzEwMjAwMzI0MDVaMDsxCzAJBgNVBAYTAlVT\n" +
+        "MQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZjZTBZ\n" +
+        "MBMGByqGSM49AgEGCCqGSM49AwEHA0IABGeQXwyeNyU4UAATfwUbMO5zaREI21Wh\n" +
+        "bds6WDu+PmfK8SWsTgsgpYxBRui+fZtYqSmbdjkurvAQ3j2fvN++BtWjga0wgaow\n" +
+        "HQYDVR0OBBYEFDF/OeJ82qBSRkAm1rdZUPbWfDzyMGsGA1UdIwRkMGKAFDF/OeJ8\n" +
+        "2qBSRkAm1rdZUPbWfDzyoT+kPTA7MQswCQYDVQQGEwJVUzENMAsGA1UEChMESmF2\n" +
+        "YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2WCCQDPNwvzFafReTAPBgNV\n" +
+        "HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAKBggqhkjOPQQDAgNJADBGAiEAlHQY\n" +
+        "QFPlODOsjLVQYSxgeSUvYzMp0vP8naeVB9bfFG8CIQCFfrKZvhq9z3bOtlYKxs2a\n" +
+        "EWUjUZ82a1JTqkP+lgHY5A==\n" +
+        "-----END CERTIFICATE-----",
+
+        // SHA256withRSA, 2048 bits
+        // Validity
+        //     Not Before: Nov  9 03:24:16 2016 GMT
+        //     Not After : Oct 20 03:24:16 2037 GMT
+        "-----BEGIN CERTIFICATE-----\n" +
+        "MIIDpzCCAo+gAwIBAgIJAJAYpR2aIlA1MA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNV\n" +
+        "BAYTAlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2Vy\n" +
+        "aXZjZTAeFw0xNjExMDkwMzI0MTZaFw0zNzEwMjAwMzI0MTZaMDsxCzAJBgNVBAYT\n" +
+        "AlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZj\n" +
+        "ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL+F/FTPODYzsU0Pakfp\n" +
+        "lsh88YoQWZPjABhCU+HPsCTMYc8UBkaiduUzregwwVBW3D7kmec2K408krGQsxdy\n" +
+        "oKJA12GL/XX1YgzDEsyBRk/gvex5lPaBIZiJ5IZlUfjLuRDGxPjtRelBTpZ7SUet\n" +
+        "PJVZz6zV6hMPGO6kQzCtbzzET515EE0okIS40LkAmtWoOmVm3gRldomaZTrZ0V2L\n" +
+        "MMaJGzrXYqk0SX+PYul8v+2EEHeMuaXG/XpK5xsg9gZvzpKqFQcBOdENoJHB07go\n" +
+        "jCmRC328ALqr+bMyktKAuYfB+mhjmN2AU8TQx72WPpvNTXxFDYcwo+8254cCAVKB\n" +
+        "e98CAwEAAaOBrTCBqjAdBgNVHQ4EFgQUlJQlQTbi8YIyiNf+SqF7LtH+gicwawYD\n" +
+        "VR0jBGQwYoAUlJQlQTbi8YIyiNf+SqF7LtH+giehP6Q9MDsxCzAJBgNVBAYTAlVT\n" +
+        "MQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZjZYIJ\n" +
+        "AJAYpR2aIlA1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3\n" +
+        "DQEBCwUAA4IBAQAI0lTY0YAKQ2VdoIQ6dnqolphLVWdNGiC9drHEYSn7+hmAD2r2\n" +
+        "v1U/9m752TkcT74a65xKbEVuVtleD/w6i+QjALW2PYt6ivjOnnY0a9Y9a9UCa00j\n" +
+        "C9415sCw84Tp9VoKtuYqzhN87bBUeABOw5dsW3z32C2N/YhprkqeF/vdx4JxulPr\n" +
+        "PKze5BREXnKLA1ISoDioCPphvNMKrSpkAofb1rTCwtgt5V/WFls283L52ORmpRGO\n" +
+        "Ja88ztXOz00ZGu0RQLwlmpN7m8tNgA/5MPrldyYIwegP4RSkkJlF/8+hxvvqfJhK\n" +
+        "FFDa0HHQSJfR2b9628Iniw1UHOMMT6qx5EHr\n" +
+        "-----END CERTIFICATE-----"
+        };
+
+    // End entity certificate.
+    private final static String[] endEntityCertStrs = {
+        // SHA256withECDSA, curve prime256v1
+        // Validity
+        //     Not Before: Nov  9 03:24:05 2016 GMT
+        //     Not After : Jul 27 03:24:05 2036 GMT
+        "-----BEGIN CERTIFICATE-----\n" +
+        "MIIB1DCCAXmgAwIBAgIJAKVa+4dIUjaLMAoGCCqGSM49BAMCMDsxCzAJBgNVBAYT\n" +
+        "AlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZj\n" +
+        "ZTAeFw0xNjExMDkwMzI0MDVaFw0zNjA3MjcwMzI0MDVaMFIxCzAJBgNVBAYTAlVT\n" +
+        "MQ0wCwYDVQQKDARKYXZhMR0wGwYDVQQLDBRTdW5KU1NFIFRlc3QgU2VyaXZjZTEV\n" +
+        "MBMGA1UEAwwMSW50ZXJPcCBUZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n" +
+        "h4vXNUJzULq4e7fAOvF0WiWU6cllOAMus1GqTFvcnRPOChl8suZsvksO0CpZqL3h\n" +
+        "jXmVX9dp1FV/rUBGLo1aG6NPME0wCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBSO8V5+\n" +
+        "bj0ik0T9BtJc4jLJt7m6wjAfBgNVHSMEGDAWgBQxfznifNqgUkZAJta3WVD21nw8\n" +
+        "8jAKBggqhkjOPQQDAgNJADBGAiEAk7MF+L9bFRwUsbPsBCbCqH9DMdzBQR+kFDNf\n" +
+        "lfn8Rs4CIQD9qWvBXd+EJqwraxiX6cftaFchn+T2HpvMboy+irMFow==\n" +
+        "-----END CERTIFICATE-----",
+
+        // SHA256withRSA, 2048 bits
+        // Validity
+        //     Not Before: Nov  9 03:24:16 2016 GMT
+        //     Not After : Jul 27 03:24:16 2036 GMT
+        "-----BEGIN CERTIFICATE-----\n" +
+        "MIIDczCCAlugAwIBAgIJAPhM2oUKx0aJMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNV\n" +
+        "BAYTAlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2Vy\n" +
+        "aXZjZTAeFw0xNjExMDkwMzI0MTZaFw0zNjA3MjcwMzI0MTZaMFIxCzAJBgNVBAYT\n" +
+        "AlVTMQ0wCwYDVQQKDARKYXZhMR0wGwYDVQQLDBRTdW5KU1NFIFRlc3QgU2VyaXZj\n" +
+        "ZTEVMBMGA1UEAwwMSW50ZXJPcCBUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+        "MIIBCgKCAQEA36tJaXfJ2B/AFvES+tnueyQPSNABVu9nfMdU+NEPamJ+FH7cEF8Z\n" +
+        "1Spr1vlQgNzCpDUVrfnmT75rCapgz5ldA9+y+3hdfUyHjZBzzfx+6GHXLB4u6eU2\n" +
+        "NATa7vqSLNbcLcfZ7/QmkFqg4JRJbX4F42kKkRJrWdKZ8UoCYC8WXWvDaZ3nUs05\n" +
+        "XHe+mBJ8qMNPTbYST1jpzXPyH5CljlFGYi2mKJDTImDhwht7mu2+zvwvbJ81Gj2X\n" +
+        "JUSTSf9fu0zxFcCk6RmJPw9nSVqePVlOwtNNBodfKN+k4yr+gOz1v8NmMtmEtklV\n" +
+        "Sulr/J4QxI+E2Zar/C+4XjxkvstIS+PNKQIDAQABo2MwYTALBgNVHQ8EBAMCA+gw\n" +
+        "HQYDVR0OBBYEFHt19CItAz0VOF0WKGWwaT4DtEsSMB8GA1UdIwQYMBaAFJSUJUE2\n" +
+        "4vGCMojX/kqhey7R/oInMBIGA1UdEQEB/wQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL\n" +
+        "BQADggEBACKYZWvo9B9IEpCCdBba2sNo4X1NI/VEY3fyUx1lkw+Kna+1d2Ab+RCZ\n" +
+        "cf3Y85fcwv03hNE///wNBp+Nde4NQRDK/oiQARzWwWslfinm5d83eQwzC3cpSzt+\n" +
+        "7ts6M5UlOblGsLXZI7THWO1tkgoEra9p+zezxLMmf/2MpNyZMZlVoJPM2YGxU9cN\n" +
+        "ws0AyeY1gpBEdT21vjsBPdxxj6qklXVMnzS3zF8YwXyOndDYQWdjmFEknRK/qmQ2\n" +
+        "gkLHrzpSpyCziecna5mGuDRdCU2dpsWiq1npEPXTq+PQGwWYcoaFTtXF8DDqhfPC\n" +
+        "4Abe8gPm6MfzerdmS3RFTj9b/DIIENM=\n" +
+        "-----END CERTIFICATE-----"
+        };
+
+    // Private key in the format of PKCS#8.
+    private final static String[] endEntityPrivateKeys = {
+        //
+        // EC private key related to cert endEntityCertStrs[0].
+        //
+        "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgA3pmS+OrIjGyUv2F\n" +
+        "K/PkyayJIePM2RTFYxNoQqmJGnihRANCAASHi9c1QnNQurh7t8A68XRaJZTpyWU4\n" +
+        "Ay6zUapMW9ydE84KGXyy5my+Sw7QKlmoveGNeZVf12nUVX+tQEYujVob",
+
+        //
+        // RSA private key related to cert endEntityCertStrs[1].
+        //
+        "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDfq0lpd8nYH8AW\n" +
+        "8RL62e57JA9I0AFW72d8x1T40Q9qYn4UftwQXxnVKmvW+VCA3MKkNRWt+eZPvmsJ\n" +
+        "qmDPmV0D37L7eF19TIeNkHPN/H7oYdcsHi7p5TY0BNru+pIs1twtx9nv9CaQWqDg\n" +
+        "lEltfgXjaQqREmtZ0pnxSgJgLxZda8NpnedSzTlcd76YEnyow09NthJPWOnNc/If\n" +
+        "kKWOUUZiLaYokNMiYOHCG3ua7b7O/C9snzUaPZclRJNJ/1+7TPEVwKTpGYk/D2dJ\n" +
+        "Wp49WU7C000Gh18o36TjKv6A7PW/w2Yy2YS2SVVK6Wv8nhDEj4TZlqv8L7hePGS+\n" +
+        "y0hL480pAgMBAAECggEBAJyP1zk+IkloIBtu7+wrdCU6HoDHKMjjlzrehHoOTI4Z\n" +
+        "F0vdaMkE6J4vrYCyz0kEPjKW/e/jxvT2wxHm8xEdtuApS61+mWJFmXTcMlNzdJnR\n" +
+        "Mr6s+gW67fAHngA94OgGFeTtyX2PFxdgeM/6vFMqLZD7S+w0SnR7WEpvla4iB7On\n" +
+        "lXqhJKVQeVc+IpByg/S4MmJb91jck73GltCaCL/b6BTrsz+zc/AY5tb8JInxjMZ9\n" +
+        "jmjmA+s6l7tnBrFQfJHlF9a374lxCOtZTxyxVJjD7tQcGpsUpSHXZGdpDcT34qYT\n" +
+        "UGh0yp2Mc/1PfWni5gS/6UGLrYmT57RRCn5YJBJTEkkCgYEA/XPCNehFaOMSxOZh\n" +
+        "OGBVhQ+eRAmdpJfMhSUsDdEdQLZyWGmZsMTHjZZrwevBX/D0dxQYDv/sAl0GZomJ\n" +
+        "d6iRCHlscycwx5Q0U/EpacsgRlYHz1nMRzXqS3Ry+8O8qQlliqCLUM7SfVgzdI5/\n" +
+        "ll9JMrng9NnRl8ccjEdOGK8g/MMCgYEA4eriKMfRslGY4uOQoTPbuEJSMMwQ2X4k\n" +
+        "lPj1p+xSQfU9QBaWJake67oBj3vpCxqN7/VkvCIeC6LCjhLpWHCn4EkdGiqkEdWz\n" +
+        "m5CHzpzVIgznzWnbt0rCVL2KdL+ihgY8KPDdsZ6tZrABHuYhsWkAu10wyvuQYM88\n" +
+        "3u6yOIQn36MCgYEAk5qR1UEzAxWTPbaJkgKQa5Cf9DHBbDS3eCcg098f8SsPxquh\n" +
+        "RRAkwzGCCgqZsJ0sUhkStdGXifzRGHAq7dPuuwe0ABAn2WNXYjeFjcYtQqkhnUFH\n" +
+        "tYURsOXdfQAOZEdDqos691GrxjHSraO7bECL6Y3VE+Oyq3jbCFsSgU+kn28CgYBT\n" +
+        "mrXZO6FJqVK33FlAns1YEgsSjeJKapklHEDkxNroF9Zz6ifkhgKwX6SGMefbORd/\n" +
+        "zsNZsBKIYdI3+52pIf+uS8BeV5tiEkCmeEUZ3AYv1LDP3rX1zc++xmn/rI97o8EN\n" +
+        "sZ2JRtyK3OV9RtL/MYmYzPLqm1Ah02+GXLVNnvKWmwKBgE8Ble8CzrXYuuPdGxXz\n" +
+        "BZU6HnXQrmTUcgeze0tj8SDHzCfsGsaG6pHrVNkT7CKsRuCHTZLM0kXmUijLFKuP\n" +
+        "5xyE257z4IbbEbs+tcbB3p28n4/47MzZkSR3kt8+FrsEMZq5oOHbFTGzgp9dhZCC\n" +
+        "dKUqlw5BPHdbxoWB/JpSHGCV"
+        };
+
+    // Private key names of endEntityPrivateKeys.
+    private final static String[] endEntityPrivateKeyNames = {
+        "EC",
+        "RSA"
+        };
+
+    /*
+     * Run the test case.
+     */
+    public void run() throws Exception {
+        SSLEngine serverEngine = createServerEngine();
+
+        //
+        // Create and size the buffers appropriately.
+        //
+        SSLSession session = serverEngine.getSession();
+        ByteBuffer serverAppInbound =
+            ByteBuffer.allocate(session.getApplicationBufferSize());
+        ByteBuffer clientHello =
+            ByteBuffer.allocate(session.getPacketBufferSize());
+
+        //
+        // Generate a ClientHello message, and check if the server
+        // engine can read it or not.
+        //
+        clientHello.put(createClientHelloMessage());
+        clientHello.flip();
+
+        SSLEngineResult serverResult =
+                serverEngine.unwrap(clientHello, serverAppInbound);
+        log("Server unwrap: ", serverResult);
+        runDelegatedTasks(serverResult, serverEngine);
+
+        //
+        // Generate server responses to the ClientHello request.
+        //
+        ByteBuffer clientNetInbound =
+            ByteBuffer.allocate(session.getPacketBufferSize());
+        ByteBuffer clientAppInbound =
+            ByteBuffer.wrap("Hello Client, I'm Server".getBytes());
+
+        serverResult = serverEngine.wrap(clientAppInbound, clientNetInbound);
+        log("Server wrap: ", serverResult);
+        runDelegatedTasks(serverResult, serverEngine);
+    }
+
+    /*
+     * Create a ClientHello message.
+     */
+    abstract protected byte[] createClientHelloMessage();
+
+    /*
+     * Create an instance of SSLContext for client use.
+     */
+    protected SSLContext createClientSSLContext() throws Exception {
+        return createSSLContext(trustedCertStrs, null, null, null);
+    }
+
+    /*
+     * Create an instance of SSLContext for server use.
+     */
+    protected SSLContext createServerSSLContext() throws Exception {
+        return createSSLContext(null,
+                endEntityCertStrs, endEntityPrivateKeys,
+                endEntityPrivateKeyNames);
+    }
+
+    /*
+     * Create an instance of SSLContext with the specified trust/key materials.
+     */
+    protected SSLContext createSSLContext(
+            String[] trustedMaterials,
+            String[] keyMaterialCerts,
+            String[] keyMaterialKeys,
+            String[] keyMaterialKeyAlgs) throws Exception {
+
+        KeyStore ts = null;     // trust store
+        KeyStore ks = null;     // key store
+        char passphrase[] = "passphrase".toCharArray();
+
+        // Generate certificate from cert string.
+        CertificateFactory cf = CertificateFactory.getInstance("X.509");
+
+        // Import the trused certs.
+        ByteArrayInputStream is;
+        if (trustedMaterials != null && trustedMaterials.length != 0) {
+            ts = KeyStore.getInstance("JKS");
+            ts.load(null, null);
+
+            Certificate[] trustedCert =
+                    new Certificate[trustedMaterials.length];
+            for (int i = 0; i < trustedMaterials.length; i++) {
+                String trustedCertStr = trustedMaterials[i];
+
+                is = new ByteArrayInputStream(trustedCertStr.getBytes());
+                try {
+                    trustedCert[i] = cf.generateCertificate(is);
+                } finally {
+                    is.close();
+                }
+
+                ts.setCertificateEntry("trusted-cert-" + i, trustedCert[i]);
+            }
+        }
+
+        // Import the key materials.
+        //
+        // Note that certification pathes bigger than one are not supported yet.
+        boolean hasKeyMaterials =
+            (keyMaterialCerts != null) && (keyMaterialCerts.length != 0) &&
+            (keyMaterialKeys != null) && (keyMaterialKeys.length != 0) &&
+            (keyMaterialKeyAlgs != null) && (keyMaterialKeyAlgs.length != 0) &&
+            (keyMaterialCerts.length == keyMaterialKeys.length) &&
+            (keyMaterialCerts.length == keyMaterialKeyAlgs.length);
+        if (hasKeyMaterials) {
+            ks = KeyStore.getInstance("JKS");
+            ks.load(null, null);
+
+            for (int i = 0; i < keyMaterialCerts.length; i++) {
+                String keyCertStr = keyMaterialCerts[i];
+
+                // generate the private key.
+                PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec(
+                    Base64.getMimeDecoder().decode(keyMaterialKeys[i]));
+                KeyFactory kf =
+                    KeyFactory.getInstance(keyMaterialKeyAlgs[i]);
+                PrivateKey priKey = kf.generatePrivate(priKeySpec);
+
+                // generate certificate chain
+                is = new ByteArrayInputStream(keyCertStr.getBytes());
+                Certificate keyCert = null;
+                try {
+                    keyCert = cf.generateCertificate(is);
+                } finally {
+                    is.close();
+                }
+
+                Certificate[] chain = new Certificate[] { keyCert };
+
+                // import the key entry.
+                ks.setKeyEntry("cert-" + i, priKey, passphrase, chain);
+            }
+        }
+
+        // Create an SSLContext object.
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
+        tmf.init(ts);
+
+        SSLContext context = SSLContext.getInstance("TLS");
+        if (hasKeyMaterials && ks != null) {
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509");
+            kmf.init(ks, passphrase);
+
+            context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+        } else {
+            context.init(null, tmf.getTrustManagers(), null);
+        }
+
+        return context;
+    }
+
+    /*
+     * Create an instance of SSLEngine in client mode.
+     */
+    protected SSLEngine createClientEngine() throws Exception {
+        return createClientEngine(createClientSSLContext());
+    }
+
+    /*
+     * Create an instance of SSLEngine in client mode with the
+     * specified SSLContext object.
+     */
+    protected SSLEngine createClientEngine(
+        SSLContext context) throws Exception {
+
+        SSLEngine engine = context.createSSLEngine();
+        engine.setUseClientMode(true);
+
+        /*
+         * Customize the SSLEngine object.
+         */
+        // blank
+
+        return engine;
+    }
+
+    /*
+     * Create an instance of SSLEngine in server mode.
+     */
+    protected SSLEngine createServerEngine() throws Exception {
+        return createServerEngine(createServerSSLContext());
+    }
+
+    /*
+     * Create an instance of SSLEngine in server mode with the
+     * specified SSLContext object.
+     */
+    protected SSLEngine createServerEngine(
+        SSLContext context) throws Exception {
+
+        SSLEngine engine = context.createSSLEngine();
+        engine.setUseClientMode(false);
+
+        /*
+         * Customize the SSLEngine object.
+         */
+        engine.setNeedClientAuth(false);
+
+        return engine;
+    }
+
+    /*
+     * Run the delagayed tasks if any.
+     *
+     * If the result indicates that we have outstanding tasks to do,
+     * go ahead and run them in this thread.
+     */
+    protected static void runDelegatedTasks(SSLEngineResult result,
+            SSLEngine engine) throws Exception {
+
+        if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
+            Runnable runnable;
+            while ((runnable = engine.getDelegatedTask()) != null) {
+                log("\trunning delegated task...");
+                runnable.run();
+            }
+            HandshakeStatus hsStatus = engine.getHandshakeStatus();
+            if (hsStatus == HandshakeStatus.NEED_TASK) {
+                throw new Exception(
+                    "handshake shouldn't need additional tasks");
+            }
+            log("\tnew HandshakeStatus: " + hsStatus);
+        }
+    }
+
+    /*
+     * Logging the specificated message and the SSLEngine operation result.
+     */
+    protected static void log(String str, SSLEngineResult result) {
+        HandshakeStatus hsStatus = result.getHandshakeStatus();
+        log(str +
+            result.getStatus() + "/" + hsStatus + ", consumed: " +
+            result.bytesConsumed() + "/produced: " + result.bytesProduced() +
+            " bytes");
+
+        if (hsStatus == HandshakeStatus.FINISHED) {
+            log("\t...ready for application data");
+        }
+    }
+
+    /*
+     * Logging the specificated message.
+     */
+    protected static void log(String str) {
+        System.out.println(str);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/lib/security/SecurityTools.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import jdk.testlibrary.JDKToolLauncher;
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.ProcessTools;
+
+public class SecurityTools {
+
+    public static final String NO_ALIAS = null;
+
+    // keytool
+
+    public static OutputAnalyzer keytool(List<String> options)
+            throws Throwable {
+
+        JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("keytool")
+                .addVMArg("-Duser.language=en")
+                .addVMArg("-Duser.country=US");
+        for (String option : options) {
+            if (option.startsWith("-J")) {
+                launcher.addVMArg(option.substring(2));
+            } else {
+                launcher.addToolArg(option);
+            }
+        }
+        return ProcessTools.executeCommand(launcher.getCommand());
+    }
+
+    public static OutputAnalyzer keytool(String options) throws Throwable {
+        return keytool(options.split("\\s+"));
+    }
+
+    public static OutputAnalyzer keytool(String... options) throws Throwable {
+        return keytool(List.of(options));
+    }
+
+    // jarsigner
+
+    public static OutputAnalyzer jarsigner(String jar, String alias,
+            List<String> options) throws Throwable {
+        JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jarsigner")
+                .addVMArg("-Duser.language=en")
+                .addVMArg("-Duser.country=US");
+        for (String option : options) {
+            if (option.startsWith("-J")) {
+                launcher.addVMArg(option.substring(2));
+            } else {
+                launcher.addToolArg(option);
+            }
+        }
+        launcher.addToolArg(jar);
+        if (alias != null) {
+            launcher.addToolArg(alias);
+        }
+        return ProcessTools.executeCommand(launcher.getCommand());
+    }
+
+    public static OutputAnalyzer jarsigner(String jar, String alias,
+            String options) throws Throwable {
+
+        return jarsigner(jar, alias, options.split("\\s+"));
+    }
+
+    public static OutputAnalyzer jarsigner(String jar, String alias,
+            String... options) throws Throwable {
+
+        return jarsigner(jar, alias, List.of(options));
+    }
+
+    public static OutputAnalyzer sign(String jar, String alias, String... options)
+            throws Throwable {
+
+        return jarsigner(jar, alias,
+                mergeOptions("-J-Djava.security.egd=file:/dev/./urandom", options));
+    }
+
+    public static OutputAnalyzer verify(String jar, String... options)
+            throws Throwable {
+
+        return jarsigner(jar, NO_ALIAS, mergeOptions("-verify", options));
+    }
+
+    // helper methods
+
+    private static List<String> mergeOptions(
+            String firstOption, String... secondPart) {
+
+        return mergeOptions(List.of(firstOption), secondPart);
+    }
+
+    private static List<String> mergeOptions(
+            List<String> firstPart, String... secondPart) {
+
+        List<String> options = new ArrayList<>(firstPart);
+        Collections.addAll(options, secondPart);
+        return options;
+    }
+}
--- a/jdk/test/sun/net/www/http/HttpClient/RetryPost.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/net/www/http/HttpClient/RetryPost.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, 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
@@ -21,10 +21,25 @@
  * questions.
  */
 
-import java.net.*;
-import java.util.*;
-import java.io.*;
-import com.sun.net.httpserver.*;
+/*
+ * @test
+ * @bug 6427251 6382788
+ * @modules jdk.httpserver
+ * @run main RetryPost
+ * @run main/othervm -Dsun.net.http.retryPost=false RetryPost noRetry
+ * @summary HttpURLConnection automatically retries non-idempotent method POST
+ */
+
+import com.sun.net.httpserver.HttpContext;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.SocketException;
+import java.net.URL;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ExecutorService;
 
--- a/jdk/test/sun/net/www/http/HttpClient/RetryPost.sh	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-#
-# Copyright (c) 2006, 2013, 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 6427251 6382788
- # @run shell/timeout=140 RetryPost.sh
- # @summary HttpURLConnection automatically retries non-idempotent method POST
-
-OS=`uname -s`
-case "$OS" in
-  SunOS | Linux | Darwin | AIX )
-    PS=":"
-    FS="/"
-    ;;
-  CYGWIN* )
-    PS=";"
-    FS="/"
-    ;;
-  Windows* )
-    PS=";"
-    FS="\\"
-    ;;
-  * )
-    echo "Unrecognized system!"
-    exit 1;
-    ;;
-esac
-
-# compile
-${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d . ${TESTSRC}${FS}RetryPost.java
-
-# run with no option specified. Should retry POST request.
-${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} RetryPost
-result=$?
-if [ "$result" -ne "0" ]; then
-    exit 1
-fi
-
-# run with option specified. Should not retry POST request.
-${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -Dsun.net.http.retryPost=false RetryPost noRetry
-result=$?
-if [ "$result" -ne "0" ]; then
-    exit 1
-fi
-
-# no failures, exit.
-exit 0
-
--- a/jdk/test/sun/net/www/http/KeepAliveStream/InfiniteLoop.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/net/www/http/KeepAliveStream/InfiniteLoop.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, 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
@@ -24,14 +24,19 @@
 /*
  * @test
  * @bug 8004863
+ * @modules jdk.httpserver
  * @summary Checks for proper close code in KeepAliveStream
  */
 
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpHandler;
 import com.sun.net.httpserver.HttpServer;
-import java.io.*;
-import java.net.*;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.URL;
 import java.util.concurrent.Phaser;
 
 // Racey test, will not always fail, but if it does then we have a problem.
--- a/jdk/test/sun/net/www/protocol/http/NoNTLM.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/net/www/protocol/http/NoNTLM.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, 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,11 +26,19 @@
  * @summary Sanity check that NTLM will not be selected by the http protocol
  *    handler when running on a profile that does not support NTLM
  * @modules java.base/sun.net.www
+ *          java.base/sun.net.www.protocol.http
  * @run main/othervm NoNTLM
  */
 
-import java.net.*;
-import java.io.*;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.net.Authenticator;
+import java.net.HttpURLConnection;
+import java.net.PasswordAuthentication;
+import java.net.Proxy;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URL;
 import sun.net.www.MessageHeader;
 
 public class NoNTLM {
@@ -208,11 +216,14 @@
     }
 
     public static void main(String[] args) throws Exception {
-        // assume NTLM is not supported when Kerberos is not available
         try {
-            Class.forName("javax.security.auth.kerberos.KerberosPrincipal");
-            System.out.println("Kerberos is present, assuming NTLM is supported too");
-            return;
+            Class<?> ntlmProxyClass = Class.forName("sun.net.www.protocol.http.NTLMAuthenticationProxy", true, NoNTLM.class.getClassLoader());
+            Field ntlmSupportedField = ntlmProxyClass.getDeclaredField("supported");
+            ntlmSupportedField.setAccessible(true);
+            if (ntlmSupportedField.getBoolean(null)) {
+                System.out.println("NTLM is supported. Nothing to do. Exiting.");
+                return;
+            }
         } catch (ClassNotFoundException okay) { }
 
         // setup Authenticator
--- a/jdk/test/sun/security/tools/keytool/KeyToolTest.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/security/tools/keytool/KeyToolTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, 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
@@ -1211,18 +1211,26 @@
     void sqePrintcertTest() throws Exception {
         remove("x.jks");
         remove("mykey.cert");
+        remove("myweakkey.cert");
         testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +
                 "-keypass changeit -genkeypair -dname CN=olala");
         testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +
                 "-export -file mykey.cert -alias mykey");
+        testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +
+                "-keypass changeit -genkeypair -dname CN=weak -keyalg rsa " +
+                "-keysize 512 -sigalg MD5withRSA -alias myweakkey");
+        testOK("", "-keystore x.jks -storetype JKS -storepass changeit " +
+                "-export -file myweakkey.cert -alias myweakkey");
         testFail("", "-printcert -file badkeystore");
         testFail("", "-printcert -file a/b/c/d");
         testOK("", "-printcert -file mykey.cert");
+        testOK("", "-printcert -file myweakkey.cert");
         FileInputStream fin = new FileInputStream("mykey.cert");
         testOK(fin, "-printcert");
         fin.close();
         remove("x.jks");
         remove("mykey.cert");
+        remove("myweakkey.cert");
     }
 
     // 8074935: jdk8 keytool doesn't validate pem files for RFC 1421 correctness
--- a/jdk/test/sun/security/tools/keytool/PrintSSL.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/security/tools/keytool/PrintSSL.java	Tue Nov 22 11:45:55 2016 -0800
@@ -24,20 +24,32 @@
 /*
  * @test
  * @bug 6480981 8160624
- * @modules java.base/sun.security.tools.keytool
  * @summary keytool should be able to import certificates from remote SSL server
+ * @library /lib/security
+ * @library /lib/testlibrary
  * @run main/othervm PrintSSL
  */
 
-import java.io.IOException;
 import java.net.ServerSocket;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.concurrent.CountDownLatch;
 import javax.net.ssl.SSLServerSocketFactory;
 import javax.net.ssl.SSLSocket;
+import jdk.testlibrary.OutputAnalyzer;
 
 public class PrintSSL {
 
-    public static void main(String[] args) throws Exception {
+    public static void main(String[] args) throws Throwable {
+        Files.deleteIfExists(Paths.get("keystore"));
+
+        // make sure that "-printcert" works with weak algorithms
+        OutputAnalyzer out = SecurityTools.keytool("-genkeypair "
+                + "-keystore keystore -storepass passphrase "
+                + "-keypass passphrase -keyalg rsa -keysize 512 "
+                + "-sigalg MD5withRSA -alias rsa_alias -dname CN=Server");
+        System.out.println(out.getOutput());
+        out.shouldHaveExitValue(0);
 
         int port = new Server().start();
         if(port == -1) {
@@ -47,7 +59,10 @@
         String cmd = String.format(
                 "-debug %s -printcert -sslserver localhost:%s",
                 ((vmOpt == null) ? "" : vmOpt ), port);
-        sun.security.tools.keytool.Main.main(cmd.split("\\s+"));
+
+        out = SecurityTools.keytool(cmd);
+        System.out.println(out.getOutput());
+        out.shouldHaveExitValue(0);
     }
 
     private static class Server implements Runnable {
@@ -68,9 +83,7 @@
         public void run() {
 
             System.setProperty("javax.net.ssl.keyStorePassword", "passphrase");
-            System.setProperty("javax.net.ssl.keyStore",
-                    System.getProperty("test.src", "./")
-                    + "/../../../../javax/net/ssl/etc/keystore");
+            System.setProperty("javax.net.ssl.keyStore", "keystore");
             SSLServerSocketFactory sslssf =
                     (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
             try (ServerSocket server = sslssf.createServerSocket(0)) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/keytool/ReadJar.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016, 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 6890872 8168882
+ * @summary keytool -printcert to recognize signed jar files
+ * @library /lib/security
+ * @library /lib/testlibrary
+ */
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import jdk.testlibrary.JarUtils;
+import jdk.testlibrary.OutputAnalyzer;
+
+public class ReadJar {
+
+    public static void main(String[] args) throws Throwable {
+        testWithMD5();
+    }
+
+    // make sure that -printcert option works
+    // if a weak algorithm was used for signing a jar
+    private static void testWithMD5() throws Throwable {
+        // create jar files
+        JarUtils.createJar("test_md5.jar", "test");
+        JarUtils.createJar("test_rsa.jar", "test");
+
+        // create a keystore and generate keys for jar signing
+        Files.deleteIfExists(Paths.get("keystore"));
+
+        OutputAnalyzer out = SecurityTools.keytool("-genkeypair "
+                + "-keystore keystore -storepass password "
+                + "-keypass password -keyalg rsa -alias rsa_alias -dname CN=A");
+        System.out.println(out.getOutput());
+        out.shouldHaveExitValue(0);
+
+        out = SecurityTools.jarsigner("test_rsa.jar", "rsa_alias",
+                "-keystore keystore -storepass password ");
+        System.out.println(out.getOutput());
+        out.shouldHaveExitValue(0);
+
+        printCert("test_rsa.jar");
+
+        out = SecurityTools.jarsigner("test_md5.jar", "rsa_alias",
+                "-keystore keystore -storepass password "
+                        + "-sigalg MD5withRSA -digestalg MD5");
+        System.out.println(out.getOutput());
+        out.shouldHaveExitValue(0);
+
+        printCert("test_md5.jar");
+    }
+
+    private static void printCert(String jar) throws Throwable {
+        OutputAnalyzer out = SecurityTools.keytool("-printcert -jarfile " + jar);
+        System.out.println(out.getOutput());
+        out.shouldHaveExitValue(0);
+        out.shouldNotContain("Not a signed jar file");
+
+        out = SecurityTools.keytool("-printcert -rfc -jarfile " + jar);
+        System.out.println(out.getOutput());
+        out.shouldHaveExitValue(0);
+        out.shouldNotContain("Not a signed jar file");
+    }
+}
--- a/jdk/test/sun/security/tools/keytool/readjar.sh	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-#
-# Copyright (c) 2009, 2013, 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 6890872
-# @summary keytool -printcert to recognize signed jar files
-#
-
-if [ "${TESTJAVA}" = "" ] ; then
-  JAVAC_CMD=`which javac`
-  TESTJAVA=`dirname $JAVAC_CMD`/..
-  COMPILEJAVA=${TESTJAVA}
-fi
-
-# set platform-dependent variables
-OS=`uname -s`
-case "$OS" in
-  Windows_* )
-    FS="\\"
-    ;;
-  * )
-    FS="/"
-    ;;
-esac
-
-KS=readjar.jks
-rm $KS
-$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS}  -storepass changeit -keypass changeit -keystore $KS \
-        -keyalg rsa -alias x -dname CN=X -genkeypair
-$COMPILEJAVA${FS}bin${FS}jar ${TESTTOOLVMOPTS} cvf readjar.jar $KS
-$COMPILEJAVA${FS}bin${FS}jarsigner ${TESTTOOLVMOPTS} -storepass changeit -keystore $KS readjar.jar x
-
-$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -printcert -jarfile readjar.jar || exit 1
-$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -printcert -jarfile readjar.jar -rfc || exit 1
-
-exit 0
-
--- a/jdk/test/sun/util/calendar/zi/tzdata/VERSION	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/util/calendar/zi/tzdata/VERSION	Tue Nov 22 11:45:55 2016 -0800
@@ -21,4 +21,4 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-tzdata2016h
+tzdata2016i
--- a/jdk/test/sun/util/calendar/zi/tzdata/antarctica	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/util/calendar/zi/tzdata/antarctica	Tue Nov 22 11:45:55 2016 -0800
@@ -87,13 +87,18 @@
 # Background:
 # http://www.timeanddate.com/news/time/antartica-time-changes-2010.html
 
+# From Steffen Thorsen (2016-10-28):
+# Australian Antarctica Division informed us that Casey changed time
+# zone to UTC+11 in "the morning of 22nd October 2016".
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Antarctica/Casey	0	-	-00	1969
 			8:00	-	+08	2009 Oct 18  2:00
 			11:00	-	+11	2010 Mar  5  2:00
 			8:00	-	+08	2011 Oct 28  2:00
 			11:00	-	+11	2012 Feb 21 17:00u
-			8:00	-	+08
+			8:00	-	+08	2016 Oct 22
+			11:00	-	+11
 Zone Antarctica/Davis	0	-	-00	1957 Jan 13
 			7:00	-	+07	1964 Nov
 			0	-	-00	1969 Feb
--- a/jdk/test/sun/util/calendar/zi/tzdata/asia	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/util/calendar/zi/tzdata/asia	Tue Nov 22 11:45:55 2016 -0800
@@ -794,9 +794,19 @@
 ###############################################################################
 
 # Cyprus
-#
+
 # Milne says the Eastern Telegraph Company used 2:14:00.  Stick with LMT.
+# IATA SSIM (1998-09) has Cyprus using EU rules for the first time.
+
+# From Paul Eggert (2016-09-09):
+# Yesterday's Cyprus Mail reports that Northern Cyprus followed Turkey's
+# lead and switched from +02/+03 to +03 year-round.
+# http://cyprus-mail.com/2016/09/08/two-time-zones-cyprus-turkey-will-not-turn-clocks-back-next-month/
 #
+# From Even Scharning (2016-10-31):
+# Looks like the time zone split in Cyprus went through last night.
+# http://cyprus-mail.com/2016/10/30/cyprus-new-division-two-time-zones-now-reality/
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cyprus	1975	only	-	Apr	13	0:00	1:00	S
 Rule	Cyprus	1975	only	-	Oct	12	0:00	0	-
@@ -811,7 +821,10 @@
 Zone	Asia/Nicosia	2:13:28 -	LMT	1921 Nov 14
 			2:00	Cyprus	EE%sT	1998 Sep
 			2:00	EUAsia	EE%sT
-# IATA SSIM (1998-09) has Cyprus using EU rules for the first time.
+Zone	Asia/Famagusta	2:15:48	-	LMT	1921 Nov 14
+			2:00	Cyprus	EE%sT	1998 Sep
+			2:00	EUAsia	EE%sT	2016 Sep  8
+			3:00	-	+03
 
 # Classically, Cyprus belongs to Asia; e.g. see Herodotus, Histories, I.72.
 # However, for various reasons many users expect to find it under Europe.
--- a/jdk/test/sun/util/calendar/zi/tzdata/australasia	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/util/calendar/zi/tzdata/australasia	Tue Nov 22 11:45:55 2016 -0800
@@ -725,11 +725,13 @@
 Rule	Tonga	2000	only	-	Mar	19	2:00s	0	-
 Rule	Tonga	2000	2001	-	Nov	Sun>=1	2:00	1:00	S
 Rule	Tonga	2001	2002	-	Jan	lastSun	2:00	0	-
+Rule	Tonga	2016	max	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Tonga	2017	max	-	Jan	Sun>=15	3:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Pacific/Tongatapu	12:19:20 -	LMT	1901
-			12:20	-	TOT	1941 # Tonga Time
-			13:00	-	TOT	1999
-			13:00	Tonga	TO%sT
+			12:20	-	+1220	1941
+			13:00	-	+13	1999
+			13:00	Tonga	+13/+14
 
 # Tuvalu
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1735,9 +1737,17 @@
 # of January the standard time in the Kingdom shall be moved backward by one
 # hour to 1:00am.
 
-# From Pulu 'Anau (2002-11-05):
+# From Pulu ʻAnau (2002-11-05):
 # The law was for 3 years, supposedly to get renewed.  It wasn't.
 
+# From Pulu ʻAnau (2016-10-27):
+# http://mic.gov.to/news-today/press-releases/6375-daylight-saving-set-to-run-from-6-november-2016-to-15-january-2017
+# Cannot find anyone who knows the rules, has seen the duration or has seen
+# the cabinet decision, but it appears we are following Fiji's rule set.
+#
+# From Tim Parenti (2016-10-26):
+# Assume Tonga will observe DST from the first Sunday in November at 02:00
+# through the third Sunday in January at 03:00, like Fiji, for now.
 
 # Wake
 
--- a/jdk/test/sun/util/calendar/zi/tzdata/europe	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/util/calendar/zi/tzdata/europe	Tue Nov 22 11:45:55 2016 -0800
@@ -1523,73 +1523,84 @@
 # But these events all occurred before the 1970 cutoff,
 # so record only the time in Rome.
 #
-# From Paul Eggert (2006-03-22):
-# For Italian DST we have three sources: Shanks & Pottenger, Whitman, and
-# F. Pollastri
-# Day-light Saving Time in Italy (2006-02-03)
-# http://toi.iriti.cnr.it/uk/ienitlt.html
-# ('FP' below), taken from an Italian National Electrotechnical Institute
-# publication. When the three sources disagree, guess who's right, as follows:
+# From Michael Deckers (2016-10-24):
+# http://www.ac-ilsestante.it/MERIDIANE/ora_legale quotes a law of 1893-08-10
+# ... [translated as] "The preceding dispositions will enter into
+# force at the instant at which, according to the time specified in
+# the 1st article, the 1st of November 1893 will begin...."
 #
-# year	FP	Shanks&P. (S)	Whitman (W)	Go with:
-# 1916	06-03	06-03 24:00	06-03 00:00	FP & W
-#	09-30	09-30 24:00	09-30 01:00	FP; guess 24:00s
-# 1917	04-01	03-31 24:00	03-31 00:00	FP & S
-#	09-30	09-29 24:00	09-30 01:00	FP & W
-# 1918	03-09	03-09 24:00	03-09 00:00	FP & S
-#	10-06	10-05 24:00	10-06 01:00	FP & W
-# 1919	03-01	03-01 24:00	03-01 00:00	FP & S
-#	10-04	10-04 24:00	10-04 01:00	FP; guess 24:00s
-# 1920	03-20	03-20 24:00	03-20 00:00	FP & S
-#	09-18	09-18 24:00	10-01 01:00	FP; guess 24:00s
-# 1944	04-02	04-03 02:00			S (see C-Eur)
-#	09-16	10-02 03:00			FP; guess 24:00s
-# 1945	09-14	09-16 24:00			FP; guess 24:00s
-# 1970	05-21	05-31 00:00			S
-#	09-20	09-27 00:00			S
+# From Pierpaolo Bernardi (2016-10-20):
+# The authoritative source for time in Italy is the national metrological
+# institute, which has a summary page of historical DST data at
+# http://www.inrim.it/res/tf/ora_legale_i.shtml
+# (2016-10-24):
+# http://www.renzobaldini.it/le-ore-legali-in-italia/
+# has still different data for 1944.  It divides Italy in two, as
+# there were effectively two governments at the time, north of Gothic
+# Line German controlled territory, official government RSI, and south
+# of the Gothic Line, controlled by allied armies.
+#
+# From Brian Inglis (2016-10-23):
+# Viceregal LEGISLATIVE DECREE. 14 September 1944, no. 219.
+# Restoration of Standard Time. (044U0219) (OJ 62 of 30.9.1944) ...
+# Given the R. law decreed on 1944-03-29, no. 92, by which standard time is
+# advanced to sixty minutes later starting at hour two on 1944-04-02; ...
+# Starting at hour three on the date 1944-09-17 standard time will be resumed.
+#
+# From Paul Eggert (2016-10-27):
+# Go with INRiM for DST rules, except as corrected by Inglis for 1944
+# for the Kingdom of Italy.  This is consistent with Renzo Baldini.
+# Model Rome's occupation by using using C-Eur rules from 1943-09-10
+# to 1944-06-04; although Rome was an open city during this period, it
+# was effectively controlled by Germany.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Italy	1916	only	-	Jun	 3	0:00s	1:00	S
-Rule	Italy	1916	only	-	Oct	 1	0:00s	0	-
-Rule	Italy	1917	only	-	Apr	 1	0:00s	1:00	S
-Rule	Italy	1917	only	-	Sep	30	0:00s	0	-
-Rule	Italy	1918	only	-	Mar	10	0:00s	1:00	S
-Rule	Italy	1918	1919	-	Oct	Sun>=1	0:00s	0	-
-Rule	Italy	1919	only	-	Mar	 2	0:00s	1:00	S
-Rule	Italy	1920	only	-	Mar	21	0:00s	1:00	S
-Rule	Italy	1920	only	-	Sep	19	0:00s	0	-
-Rule	Italy	1940	only	-	Jun	15	0:00s	1:00	S
-Rule	Italy	1944	only	-	Sep	17	0:00s	0	-
-Rule	Italy	1945	only	-	Apr	 2	2:00	1:00	S
-Rule	Italy	1945	only	-	Sep	15	0:00s	0	-
-Rule	Italy	1946	only	-	Mar	17	2:00s	1:00	S
-Rule	Italy	1946	only	-	Oct	 6	2:00s	0	-
-Rule	Italy	1947	only	-	Mar	16	0:00s	1:00	S
-Rule	Italy	1947	only	-	Oct	 5	0:00s	0	-
-Rule	Italy	1948	only	-	Feb	29	2:00s	1:00	S
-Rule	Italy	1948	only	-	Oct	 3	2:00s	0	-
-Rule	Italy	1966	1968	-	May	Sun>=22	0:00	1:00	S
-Rule	Italy	1966	1969	-	Sep	Sun>=22	0:00	0	-
-Rule	Italy	1969	only	-	Jun	 1	0:00	1:00	S
-Rule	Italy	1970	only	-	May	31	0:00	1:00	S
-Rule	Italy	1970	only	-	Sep	lastSun	0:00	0	-
-Rule	Italy	1971	1972	-	May	Sun>=22	0:00	1:00	S
-Rule	Italy	1971	only	-	Sep	lastSun	1:00	0	-
-Rule	Italy	1972	only	-	Oct	 1	0:00	0	-
-Rule	Italy	1973	only	-	Jun	 3	0:00	1:00	S
-Rule	Italy	1973	1974	-	Sep	lastSun	0:00	0	-
-Rule	Italy	1974	only	-	May	26	0:00	1:00	S
-Rule	Italy	1975	only	-	Jun	 1	0:00s	1:00	S
-Rule	Italy	1975	1977	-	Sep	lastSun	0:00s	0	-
-Rule	Italy	1976	only	-	May	30	0:00s	1:00	S
-Rule	Italy	1977	1979	-	May	Sun>=22	0:00s	1:00	S
-Rule	Italy	1978	only	-	Oct	 1	0:00s	0	-
-Rule	Italy	1979	only	-	Sep	30	0:00s	0	-
+Rule	Italy	1916	only	-	Jun	 3	24:00	1:00	S
+Rule	Italy	1916	1917	-	Sep	30	24:00	0	-
+Rule	Italy	1917	only	-	Mar	31	24:00	1:00	S
+Rule	Italy	1918	only	-	Mar	 9	24:00	1:00	S
+Rule	Italy	1918	only	-	Oct	 6	24:00	0	-
+Rule	Italy	1919	only	-	Mar	 1	24:00	1:00	S
+Rule	Italy	1919	only	-	Oct	 4	24:00	0	-
+Rule	Italy	1920	only	-	Mar	20	24:00	1:00	S
+Rule	Italy	1920	only	-	Sep	18	24:00	0	-
+Rule	Italy	1940	only	-	Jun	14	24:00	1:00	S
+Rule	Italy	1942	only	-	Nov	 2	 2:00s	0	-
+Rule	Italy	1943	only	-	Mar	29	 2:00s	1:00	S
+Rule	Italy	1943	only	-	Oct	 4	 2:00s	0	-
+Rule	Italy	1944	only	-	Apr	 2	 2:00s	1:00	S
+Rule	Italy	1944	only	-	Sep	17	 2:00s	0	-
+Rule	Italy	1945	only	-	Apr	 2	 2:00	1:00	S
+Rule	Italy	1945	only	-	Sep	15	 1:00	0	-
+Rule	Italy	1946	only	-	Mar	17	 2:00s	1:00	S
+Rule	Italy	1946	only	-	Oct	 6	 2:00s	0	-
+Rule	Italy	1947	only	-	Mar	16	 0:00s	1:00	S
+Rule	Italy	1947	only	-	Oct	 5	 0:00s	0	-
+Rule	Italy	1948	only	-	Feb	29	 2:00s	1:00	S
+Rule	Italy	1948	only	-	Oct	 3	 2:00s	0	-
+Rule	Italy	1966	1968	-	May	Sun>=22	 0:00s	1:00	S
+Rule	Italy	1966	only	-	Sep	24	24:00	0	-
+Rule	Italy	1967	1969	-	Sep	Sun>=22	 0:00s	0	-
+Rule	Italy	1969	only	-	Jun	 1	 0:00s	1:00	S
+Rule	Italy	1970	only	-	May	31	 0:00s	1:00	S
+Rule	Italy	1970	only	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1971	1972	-	May	Sun>=22	 0:00s	1:00	S
+Rule	Italy	1971	only	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1972	only	-	Oct	 1	 0:00s	0	-
+Rule	Italy	1973	only	-	Jun	 3	 0:00s	1:00	S
+Rule	Italy	1973	1974	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1974	only	-	May	26	 0:00s	1:00	S
+Rule	Italy	1975	only	-	Jun	 1	 0:00s	1:00	S
+Rule	Italy	1975	1977	-	Sep	lastSun	 0:00s	0	-
+Rule	Italy	1976	only	-	May	30	 0:00s	1:00	S
+Rule	Italy	1977	1979	-	May	Sun>=22	 0:00s	1:00	S
+Rule	Italy	1978	only	-	Oct	 1	 0:00s	0	-
+Rule	Italy	1979	only	-	Sep	30	 0:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Rome	0:49:56 -	LMT	1866 Sep 22
-			0:49:56	-	RMT	1893 Nov  1  0:00s # Rome Mean
-			1:00	Italy	CE%sT	1942 Nov  2  2:00s
-			1:00	C-Eur	CE%sT	1944 Jul
+			0:49:56	-	RMT	1893 Oct 31 23:49:56 # Rome Mean
+			1:00	Italy	CE%sT	1943 Sep 10
+			1:00	C-Eur	CE%sT	1944 Jun  4
 			1:00	Italy	CE%sT	1980
 			1:00	EU	CE%sT
 
@@ -1788,6 +1799,10 @@
 # See Europe/Belgrade.
 
 # Malta
+#
+# From Paul Eggert (2016-10-21):
+# Assume 1900-1972 was like Rome, overriding Shanks.
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Malta	1973	only	-	Mar	31	0:00s	1:00	S
 Rule	Malta	1973	only	-	Sep	29	0:00s	0	-
@@ -1798,8 +1813,6 @@
 Rule	Malta	1980	only	-	Mar	31	2:00	1:00	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Malta	0:58:04 -	LMT	1893 Nov  2  0:00s # Valletta
-			1:00	Italy	CE%sT	1942 Nov  2  2:00s
-			1:00	C-Eur	CE%sT	1945 Apr  2  2:00s
 			1:00	Italy	CE%sT	1973 Mar 31
 			1:00	Malta	CE%sT	1981
 			1:00	EU	CE%sT
@@ -1931,7 +1944,7 @@
 # Amsterdam mean time.
 
 # The data entries before 1945 are taken from
-# http://www.staff.science.uu.nl/~gent0113/idl/idl.htm
+# http://www.staff.science.uu.nl/~gent0113/wettijd/wettijd.htm
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Neth	1916	only	-	May	 1	0:00	1:00	NST	# Netherlands Summer Time
--- a/jdk/test/sun/util/calendar/zi/tzdata/zone.tab	Wed Nov 16 14:27:23 2016 -0800
+++ b/jdk/test/sun/util/calendar/zi/tzdata/zone.tab	Tue Nov 22 11:45:55 2016 -0800
@@ -175,7 +175,8 @@
 CV	+1455-02331	Atlantic/Cape_Verde
 CW	+1211-06900	America/Curacao
 CX	-1025+10543	Indian/Christmas
-CY	+3510+03322	Asia/Nicosia
+CY	+3510+03322	Asia/Nicosia	Cyprus (most areas)
+CY	+3507+03357	Asia/Famagusta	Northern Cyprus
 CZ	+5005+01426	Europe/Prague
 DE	+5230+01322	Europe/Berlin	Germany (most areas)
 DE	+4742+00841	Europe/Busingen	Busingen
--- a/langtools/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -386,3 +386,4 @@
 296c875051187918f8f3f87e9432036d13013d39 jdk-9+141
 d245e56f4a79a8a8d18bd143c08f079ee98ab638 jdk-9+142
 6ef8a1453577832626b0efb7f70a3102b721ebbf jdk-9+143
+47871e348144bafddea0ede3a44299461e254a2d jdk-9+144
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Scope.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Scope.java	Tue Nov 22 11:45:55 2016 -0800
@@ -137,12 +137,18 @@
     /** Returns true iff the given Symbol is in this scope or any outward scope.
      */
     public boolean includes(final Symbol sym) {
+        return includes(sym, RECURSIVE);
+    }
+
+    /** Returns true iff the given Symbol is in this scope, optionally checking outward scopes.
+     */
+    public boolean includes(final Symbol sym, LookupKind lookupKind) {
         return getSymbolsByName(sym.name, new Filter<Symbol>() {
             @Override
             public boolean accepts(Symbol t) {
                 return t == sym;
             }
-        }).iterator().hasNext();
+        }, lookupKind).iterator().hasNext();
     }
 
     /** Returns true iff this scope does not contain any Symbol. Does not inspect outward scopes.
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java	Tue Nov 22 11:45:55 2016 -0800
@@ -383,7 +383,19 @@
         addRootPackageFor(unnamedModule);
         unnamedModule.enclosedPackages = unnamedModule.enclosedPackages.prepend(unnamedModule.unnamedPackage);
 
-        errModule = new ModuleSymbol(names.empty, null) { };
+        errModule = new ModuleSymbol(names.empty, null) {
+                {
+                    directives = List.nil();
+                    exports = List.nil();
+                    provides = List.nil();
+                    uses = List.nil();
+                    ModuleSymbol java_base = enterModule(names.java_base);
+                    com.sun.tools.javac.code.Directive.RequiresDirective d =
+                            new com.sun.tools.javac.code.Directive.RequiresDirective(java_base,
+                                    EnumSet.of(com.sun.tools.javac.code.Directive.RequiresFlag.MANDATED));
+                    requires = List.of(d);
+                }
+            };
         addRootPackageFor(errModule);
 
         noModule = new ModuleSymbol(names.empty, null) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java	Tue Nov 22 11:45:55 2016 -0800
@@ -293,8 +293,11 @@
     private void enterModule(JCCompilationUnit toplevel, ClassSymbol c, Set<ModuleSymbol> modules) {
         boolean isModuleInfo = toplevel.sourcefile.isNameCompatible("module-info", Kind.SOURCE);
         boolean isModuleDecl = toplevel.defs.nonEmpty() && toplevel.defs.head.hasTag(MODULEDEF);
-        if (isModuleInfo && isModuleDecl) {
+        if (isModuleDecl) {
             JCModuleDecl decl = (JCModuleDecl) toplevel.defs.head;
+            if (!isModuleInfo) {
+                log.error(decl.pos(), Errors.ModuleDeclSbInModuleInfoJava);
+            }
             Name name = TreeInfo.fullName(decl.qualId);
             ModuleSymbol sym;
             if (c != null) {
@@ -330,9 +333,6 @@
                 JCTree tree = toplevel.defs.isEmpty() ? toplevel : toplevel.defs.head;
                 log.error(tree.pos(), Errors.ExpectedModule);
             }
-        } else if (isModuleDecl) {
-            JCTree tree = toplevel.defs.head;
-            log.error(tree.pos(), Errors.ModuleDeclSbInModuleInfoJava);
         }
     }
 
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Tue Nov 22 11:45:55 2016 -0800
@@ -62,6 +62,7 @@
 
 import static com.sun.tools.javac.code.Flags.*;
 import static com.sun.tools.javac.code.Kinds.Kind.*;
+import com.sun.tools.javac.code.Scope.LookupKind;
 import static com.sun.tools.javac.code.TypeTag.ARRAY;
 import static com.sun.tools.javac.code.TypeTag.CLASS;
 import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
@@ -2186,7 +2187,11 @@
             // Sometimes anonymous classes don't have an outer
             // instance, however, there is no reliable way to tell so
             // we never strip this$n
-            if (!currentOwner.name.isEmpty())
+            // ditto for local classes. Local classes that have an enclosing method set
+            // won't pass the "hasOuterInstance" check above, but those that don't have an
+            // enclosing method (i.e. from initializers) will pass that check.
+            boolean local = !currentOwner.owner.members().includes(currentOwner, LookupKind.NON_RECURSIVE);
+            if (!currentOwner.name.isEmpty() && !local)
                 type = new MethodType(adjustMethodParams(flags, type.getParameterTypes()),
                                       type.getReturnType(),
                                       type.getThrownTypes(),
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Tue Nov 22 11:45:55 2016 -0800
@@ -35,6 +35,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.EnumSet;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -43,6 +44,7 @@
 import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
@@ -200,31 +202,37 @@
         // The standard file manager code knows to split apart the NULL-separated components.
         @Override
         public boolean process(OptionHelper helper, String option, String arg) {
-            if (!arg.contains("=")) { // could be more strict regeex, e.g. "(?i)[a-z0-9_.]+=.*"
-                helper.error(Errors.LocnInvalidArgForXpatch(arg));
+            if (arg.isEmpty()) {
+                helper.error("err.no.value.for.option", option);
+                return true;
+            } else if (getPattern().matcher(arg).matches()) {
+                String prev = helper.get(PATCH_MODULE);
+                if (prev == null) {
+                    super.process(helper, option, arg);
+                    return false;
+                } else {
+                    String argModulePackage = arg.substring(0, arg.indexOf('='));
+                    boolean isRepeated = Arrays.stream(prev.split("\0"))
+                            .map(s -> s.substring(0, s.indexOf('=')))
+                            .collect(Collectors.toSet())
+                            .contains(argModulePackage);
+                    if (isRepeated) {
+                        helper.error("err.repeated.value.for.patch.module", argModulePackage);
+                        return true;
+                    } else {
+                        super.process(helper, option, prev + '\0' + arg);
+                        return false;
+                    }
+                }
+            } else {
+                helper.error("err.bad.value.for.option", option, arg);
+                return true;
             }
-
-            String previous = helper.get(this);
-            if (previous == null) {
-                return super.process(helper, option, arg);
-            }
+        }
 
-            Map<String,String> map = new LinkedHashMap<>();
-            for (String s : previous.split("\0")) {
-                int sep = s.indexOf('=');
-                map.put(s.substring(0, sep), s.substring(sep + 1));
-            }
-
-            int sep = arg.indexOf('=');
-            map.put(arg.substring(0, sep), arg.substring(sep + 1));
-
-            StringBuilder sb = new StringBuilder();
-            map.forEach((m, p) -> {
-                if (sb.length() > 0)
-                    sb.append('\0');
-                sb.append(m).append('=').append(p);
-            });
-            return super.process(helper, option, sb.toString());
+        @Override
+        public Pattern getPattern() {
+            return Pattern.compile("([^/]+)=(,*[^,].*)");
         }
     },
 
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties	Tue Nov 22 11:45:55 2016 -0800
@@ -361,6 +361,8 @@
     bad value for {0} option: ''{1}''
 javac.err.no.value.for.option=\
     no value for {0} option
+javac.err.repeated.value.for.patch.module=\
+    --patch-module specified more than once for {0}
 
 ## messages
 
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java	Tue Nov 22 11:45:55 2016 -0800
@@ -535,7 +535,7 @@
 
         TypeElement superClass = utils.getSuperClass(typeElement);
         while (superClass != null) {
-            if (visibleMemberMap.hasMembersFor(superClass)) {
+            if (visibleMemberMap.hasMembers(superClass)) {
                 liNav.addContent(getNavSummaryLink(superClass, true));
                 return;
             }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java	Tue Nov 22 11:45:55 2016 -0800
@@ -135,8 +135,6 @@
      */
     public String docrootparent = "";
 
-    public boolean sortedMethodDetails = false;
-
     /**
      * True if command line option "-nohelp" is used. Default value is false.
      */
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java	Tue Nov 22 11:45:55 2016 -0800
@@ -72,7 +72,7 @@
         VisibleMemberMap visibleMemberMap = new VisibleMemberMap(
                 typeElement,
                 VisibleMemberMap.Kind.CONSTRUCTORS, configuration);
-        SortedSet<Element> constructors = visibleMemberMap.getMembersFor(typeElement);
+        List<Element> constructors = visibleMemberMap.getMembers(typeElement);
         for (Element constructor : constructors) {
             if (utils.isProtected(constructor) || utils.isPrivate(constructor)) {
                 setFoundNonPubConstructor(true);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AbstractMemberBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AbstractMemberBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -25,6 +25,15 @@
 
 package jdk.javadoc.internal.doclets.toolkit.builders;
 
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.lang.model.element.Element;
+
+import jdk.javadoc.internal.doclets.formats.html.ConfigurationImpl;
 import jdk.javadoc.internal.doclets.toolkit.Content;
 import jdk.javadoc.internal.doclets.toolkit.DocletException;
 
@@ -42,6 +51,7 @@
  */
 public abstract class AbstractMemberBuilder extends AbstractBuilder {
 
+    public final Comparator<Element> comparator;
     /**
      * Construct a SubBuilder.
      * @param context a context object, providing information used in this run
@@ -49,6 +59,7 @@
      */
     public AbstractMemberBuilder(Context context) {
         super(context);
+        comparator = utils.makeGeneralPurposeComparator();
     }
 
     /**
@@ -83,4 +94,10 @@
      * @return true if this subbuilder has anything to document
      */
     public abstract boolean hasMembersToDocument();
+
+    public SortedSet<Element> asSortedSet(Collection<Element> members) {
+        SortedSet<Element> out = new TreeSet<>(comparator);
+        out.addAll(members);
+        return out;
+    }
 }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeFieldBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeFieldBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -67,7 +67,7 @@
     /**
      * The list of members being documented.
      */
-    protected SortedSet<Element> members;
+    protected List<Element> members;
 
     /**
      * The index of the current member that is being documented at this point
@@ -91,7 +91,7 @@
         this.typeElement = typeElement;
         this.writer = writer;
         this.visibleMemberMap = new VisibleMemberMap(typeElement, memberType, configuration);
-        this.members = this.visibleMemberMap.getMembersFor(typeElement);
+        this.members = this.visibleMemberMap.getMembers(typeElement);
     }
 
 
@@ -118,26 +118,6 @@
         return "AnnotationTypeFieldDetails";
     }
 
-    /**
-     * Returns a list of members that will be documented for the given class.
-     * This information can be used for doclet specific documentation
-     * generation.
-     *
-     * @param typeElement the TypeElement we want to check.
-     * @return a list of members that will be documented.
-     */
-    public SortedSet<Element> members(TypeElement typeElement) {
-        return visibleMemberMap.getMembersFor(typeElement);
-    }
-
-    /**
-     * Returns the visible member map for the members of this class.
-     *
-     * @return the visible member map for the members of this class.
-     */
-    public VisibleMemberMap getVisibleMemberMap() {
-        return visibleMemberMap;
-    }
 
     /**
      * Returns whether or not there are members to document.
@@ -145,7 +125,7 @@
      */
     @Override
     public boolean hasMembersToDocument() {
-        return members.size() > 0;
+        return !members.isEmpty();
     }
 
     /**
@@ -172,16 +152,19 @@
         if (writer == null) {
             return;
         }
-        if (!members.isEmpty()) {
+        if (hasMembersToDocument()) {
             writer.addAnnotationFieldDetailsMarker(memberDetailsTree);
-            for (Element element : members) {
-                currentMember = element;
+
+            Element lastElement = members.get(members.size() - 1);
+            for (Element member : members) {
+                currentMember = member;
                 Content detailsTree = writer.getMemberTreeHeader();
                 writer.addAnnotationDetailsTreeHeader(typeElement, detailsTree);
-                Content annotationDocTree = writer.getAnnotationDocTreeHeader(element, detailsTree);
+                Content annotationDocTree = writer.getAnnotationDocTreeHeader(currentMember,
+                        detailsTree);
                 buildChildren(node, annotationDocTree);
                 detailsTree.addContent(writer.getAnnotationDoc(
-                        annotationDocTree, currentMember == members.last()));
+                        annotationDocTree, currentMember == lastElement));
                 memberDetailsTree.addContent(writer.getAnnotationDetails(detailsTree));
             }
         }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -68,7 +68,7 @@
     /**
      * The list of members being documented.
      */
-    protected SortedSet<Element> members;
+    protected List<Element> members;
 
     /**
      * The index of the current member that is being documented at this point
@@ -82,6 +82,7 @@
      * @param context  the build context.
      * @param typeElement the class whose members are being documented.
      * @param writer the doclet specific writer.
+     * @param memberType the kind of member this builder processes.
      */
     protected AnnotationTypeRequiredMemberBuilder(Context context,
             TypeElement typeElement,
@@ -91,7 +92,7 @@
         this.typeElement = typeElement;
         this.writer = writer;
         this.visibleMemberMap = new VisibleMemberMap(typeElement, memberType, configuration);
-        this.members = this.visibleMemberMap.getMembersFor(typeElement);
+        this.members = this.visibleMemberMap.getMembers(typeElement);
     }
 
 
@@ -101,6 +102,7 @@
      * @param context  the build context.
      * @param typeElement the class whose members are being documented.
      * @param writer the doclet specific writer.
+     * @return an instance of this object
      */
     public static AnnotationTypeRequiredMemberBuilder getInstance(
             Context context, TypeElement typeElement,
@@ -119,33 +121,12 @@
     }
 
     /**
-     * Returns a list of members that will be documented for the given class.
-     * This information can be used for doclet specific documentation
-     * generation.
-     *
-     * @param typeElement the {@link TypeElement} we want to check.
-     * @return a list of members that will be documented.
-     */
-    public SortedSet<Element> members(TypeElement typeElement) {
-        return visibleMemberMap.getMembersFor(typeElement);
-    }
-
-    /**
-     * Returns the visible member map for the members of this class.
-     *
-     * @return the visible member map for the members of this class.
-     */
-    public VisibleMemberMap getVisibleMemberMap() {
-        return visibleMemberMap;
-    }
-
-    /**
      * Returns whether or not there are members to document.
      * @return whether or not there are members to document
      */
     @Override
     public boolean hasMembersToDocument() {
-        return members.size() > 0;
+        return !members.isEmpty();
     }
 
     /**
@@ -165,24 +146,25 @@
      *
      * @param node the XML element that specifies which components to document
      * @param memberDetailsTree the content tree to which the documentation will be added
+     * @throws DocletException if an error occurs
      */
     public void buildAnnotationTypeMember(XMLNode node, Content memberDetailsTree)
             throws DocletException {
         if (writer == null) {
             return;
         }
-        int size = members.size();
-        if (size > 0) {
+        if (hasMembersToDocument()) {
             writer.addAnnotationDetailsMarker(memberDetailsTree);
-            for (Element element : members) {
-                currentMember = element;
+            Element lastMember = members.get((members.size() - 1));
+            for (Element member : members) {
+                currentMember = member;
                 Content detailsTree = writer.getMemberTreeHeader();
                 writer.addAnnotationDetailsTreeHeader(typeElement, detailsTree);
                 Content annotationDocTree = writer.getAnnotationDocTreeHeader(
-                        element, detailsTree);
+                        currentMember, detailsTree);
                 buildChildren(node, annotationDocTree);
                 detailsTree.addContent(writer.getAnnotationDoc(
-                        annotationDocTree, currentMember == members.last()));
+                        annotationDocTree, currentMember == lastMember));
                 memberDetailsTree.addContent(writer.getAnnotationDetails(detailsTree));
             }
         }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -275,7 +275,7 @@
     private boolean hasConstantField (TypeElement typeElement) {
         VisibleMemberMap visibleMemberMapFields = new VisibleMemberMap(typeElement,
             VisibleMemberMap.Kind.FIELDS, configuration);
-        SortedSet<Element> fields = visibleMemberMapFields.getLeafClassMembers();
+        List<Element> fields = visibleMemberMapFields.getLeafMembers();
         for (Element f : fields) {
             VariableElement field = (VariableElement)f;
             if (field.getConstantValue() != null) {
@@ -350,21 +350,21 @@
         }
 
         /**
-         * Return the list of visible constant fields for the given TypeElement.
-         * @return the list of visible constant fields for the given TypeElement.
+         * Returns a set of visible constant fields for the given type.
+         * @return the set of visible constant fields for the given type.
          */
         protected SortedSet<VariableElement> members() {
-            SortedSet<Element> list = visibleMemberMapFields.getLeafClassMembers();
-            list.addAll(visibleMemberMapEnumConst.getLeafClassMembers());
-            SortedSet<VariableElement> inclList =
+            List<Element> members = visibleMemberMapFields.getLeafMembers();
+            members.addAll(visibleMemberMapEnumConst.getLeafMembers());
+            SortedSet<VariableElement> includes =
                     new TreeSet<>(utils.makeGeneralPurposeComparator());
-            for (Element element : list) {
+            for (Element element : members) {
                 VariableElement member = (VariableElement)element;
                 if (member.getConstantValue() != null) {
-                    inclList.add(member);
+                    includes.add(member);
                 }
             }
-            return inclList;
+            return includes;
         }
     }
 }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -59,7 +59,7 @@
     /**
      * The current constructor that is being documented at this point in time.
      */
-    private ExecutableElement constructor;
+    private ExecutableElement currentConstructor;
 
     /**
      * The class whose constructors are being documented.
@@ -79,7 +79,7 @@
     /**
      * The constructors being documented.
      */
-    private final SortedSet<Element> constructors;
+    private final List<Element> constructors;
 
     /**
      * Construct a new ConstructorBuilder.
@@ -99,7 +99,7 @@
                 typeElement,
                 VisibleMemberMap.Kind.CONSTRUCTORS,
                 configuration);
-        constructors = visibleMemberMap.getMembersFor(typeElement);
+        constructors = visibleMemberMap.getMembers(typeElement);
         for (Element ctor : constructors) {
             if (utils.isProtected(ctor) || utils.isPrivate(ctor)) {
                 writer.setFoundNonPubConstructor(true);
@@ -137,18 +137,6 @@
     }
 
     /**
-     * Returns a list of constructors that will be documented for the given class.
-     * This information can be used for doclet specific documentation
-     * generation.
-     *
-     * @param typeElement the class
-     * @return a list of constructors that will be documented.
-     */
-    public SortedSet<Element> members(TypeElement typeElement) {
-        return visibleMemberMap.getMembersFor(typeElement);
-    }
-
-    /**
      * Return the constructor writer for this builder.
      *
      * @return the constructor writer for this builder.
@@ -168,17 +156,17 @@
         if (writer == null) {
             return;
         }
-        int size = constructors.size();
-        if (size > 0) {
+        if (hasMembersToDocument()) {
             Content constructorDetailsTree = writer.getConstructorDetailsTreeHeader(typeElement,
                     memberDetailsTree);
-            for (Element ctor : constructors) {
-                constructor = (ExecutableElement)ctor;
-                Content constructorDocTree = writer.getConstructorDocTreeHeader(
-                        constructor, constructorDetailsTree);
+
+            Element lastElement = constructors.get(constructors.size() - 1);
+            for (Element contructor : constructors) {
+                currentConstructor = (ExecutableElement)contructor;
+                Content constructorDocTree = writer.getConstructorDocTreeHeader(currentConstructor, constructorDetailsTree);
                 buildChildren(node, constructorDocTree);
                 constructorDetailsTree.addContent(writer.getConstructorDoc(constructorDocTree,
-                        constructors.last().equals(constructor)));
+                        currentConstructor == lastElement));
             }
             memberDetailsTree.addContent(
                     writer.getConstructorDetails(constructorDetailsTree));
@@ -192,7 +180,7 @@
      * @param constructorDocTree the content tree to which the documentation will be added
      */
     public void buildSignature(XMLNode node, Content constructorDocTree) {
-        constructorDocTree.addContent(writer.getSignature(constructor));
+        constructorDocTree.addContent(writer.getSignature(currentConstructor));
     }
 
     /**
@@ -202,7 +190,7 @@
      * @param constructorDocTree the content tree to which the documentation will be added
      */
     public void buildDeprecationInfo(XMLNode node, Content constructorDocTree) {
-        writer.addDeprecated(constructor, constructorDocTree);
+        writer.addDeprecated(currentConstructor, constructorDocTree);
     }
 
     /**
@@ -214,7 +202,7 @@
      */
     public void buildConstructorComments(XMLNode node, Content constructorDocTree) {
         if (!configuration.nocomment) {
-            writer.addComments(constructor, constructorDocTree);
+            writer.addComments(currentConstructor, constructorDocTree);
         }
     }
 
@@ -225,6 +213,6 @@
      * @param constructorDocTree the content tree to which the documentation will be added
      */
     public void buildTagInfo(XMLNode node, Content constructorDocTree) {
-        writer.addTags(constructor, constructorDocTree);
+        writer.addTags(currentConstructor, constructorDocTree);
     }
 }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -67,9 +67,9 @@
     private final EnumConstantWriter writer;
 
     /**
-     * The list of enum constants being documented.
+     * The set of enum constants being documented.
      */
-    private final SortedSet<Element> enumConstants;
+    private final List<Element> enumConstants;
 
     /**
      * The current enum constant that is being documented at this point
@@ -94,7 +94,7 @@
                 typeElement,
                 VisibleMemberMap.Kind.ENUM_CONSTANTS,
                 configuration);
-        enumConstants = visibleMemberMap.getMembersFor(typeElement);
+        enumConstants = visibleMemberMap.getMembers(typeElement);
     }
 
     /**
@@ -119,34 +119,13 @@
     }
 
     /**
-     * Returns a list of enum constants that will be documented for the given class.
-     * This information can be used for doclet specific documentation
-     * generation.
-     *
-     * @param typeElement the {@link TypeElement} we want to check.
-     * @return a list of enum constants that will be documented.
-     */
-    public SortedSet<Element> members(TypeElement typeElement) {
-        return visibleMemberMap.getMembersFor(typeElement);
-    }
-
-    /**
-     * Returns the visible member map for the enum constants of this class.
-     *
-     * @return the visible member map for the enum constants of this class.
-     */
-    public VisibleMemberMap getVisibleMemberMap() {
-        return visibleMemberMap;
-    }
-
-    /**
      * Returns whether or not there are members to document.
      *
      * @return whether or not there are members to document
      */
     @Override
     public boolean hasMembersToDocument() {
-        return enumConstants.size() > 0;
+        return !enumConstants.isEmpty();
     }
 
     /**
@@ -160,16 +139,17 @@
         if (writer == null) {
             return;
         }
-        if (!enumConstants.isEmpty()) {
+        if (hasMembersToDocument()) {
             Content enumConstantsDetailsTree = writer.getEnumConstantsDetailsTreeHeader(typeElement,
                     memberDetailsTree);
-            for (Element element : enumConstants) {
-                currentElement = (VariableElement)element;
+            Element lastElement = enumConstants.get(enumConstants.size() - 1);
+            for (Element enumConstant : enumConstants) {
+                currentElement = (VariableElement)enumConstant;
                 Content enumConstantsTree = writer.getEnumConstantsTreeHeader(currentElement,
                         enumConstantsDetailsTree);
                 buildChildren(node, enumConstantsTree);
                 enumConstantsDetailsTree.addContent(writer.getEnumConstants(
-                        enumConstantsTree, currentElement.equals(enumConstants.last())));
+                        enumConstantsTree, currentElement == lastElement));
             }
             memberDetailsTree.addContent(
                     writer.getEnumConstantsDetails(enumConstantsDetailsTree));
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -69,7 +69,7 @@
     /**
      * The list of fields being documented.
      */
-    private final SortedSet<Element> fields;
+    private final List<Element> fields;
 
     /**
      * The index of the current field that is being documented at this point
@@ -95,7 +95,7 @@
                 typeElement,
                 VisibleMemberMap.Kind.FIELDS,
                 configuration);
-        fields = visibleMemberMap.getLeafClassMembers();
+        fields = visibleMemberMap.getLeafMembers();
     }
 
     /**
@@ -121,27 +121,6 @@
     }
 
     /**
-     * Returns a list of fields that will be documented for the given class.
-     * This information can be used for doclet specific documentation
-     * generation.
-     *
-     * @param typeElement the {@link TypeElement} we want to check.
-     * @return a list of fields that will be documented.
-     */
-    public SortedSet<Element> members(TypeElement typeElement) {
-        return visibleMemberMap.getMembersFor(typeElement);
-    }
-
-    /**
-     * Returns the visible member map for the fields of this class.
-     *
-     * @return the visible member map for the fields of this class.
-     */
-    public VisibleMemberMap getVisibleMemberMap() {
-        return visibleMemberMap;
-    }
-
-    /**
      * Returns whether or not there are members to document.
      *
      * @return whether or not there are members to document
@@ -164,12 +143,14 @@
         }
         if (!fields.isEmpty()) {
             Content fieldDetailsTree = writer.getFieldDetailsTreeHeader(typeElement, memberDetailsTree);
+
+            Element lastElement = fields.get(fields.size() - 1);
             for (Element element : fields) {
                 currentElement = (VariableElement)element;
                 Content fieldDocTree = writer.getFieldDocTreeHeader(currentElement, fieldDetailsTree);
                 buildChildren(node, fieldDocTree);
                 fieldDetailsTree.addContent(writer.getFieldDoc(
-                        fieldDocTree, currentElement.equals(fields.last())));
+                        fieldDocTree, currentElement == lastElement));
             }
             memberDetailsTree.addContent(
                     writer.getFieldDetails(fieldDetailsTree));
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -182,7 +182,9 @@
      * @see VisibleMemberMap
      */
     public SortedSet<Element> members(VisibleMemberMap.Kind type) {
-        return visibleMemberMaps.get(type).getLeafClassMembers();
+        TreeSet<Element> out = new TreeSet<>(comparator);
+        out.addAll(visibleMemberMaps.get(type).getLeafMembers());
+        return out;
     }
 
     /**
@@ -336,7 +338,7 @@
      */
     private void buildSummary(MemberSummaryWriter writer,
             VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
-        SortedSet<Element> members = visibleMemberMap.getLeafClassMembers();
+        SortedSet<Element> members = asSortedSet(visibleMemberMap.getLeafMembers());
         if (!members.isEmpty()) {
             List<Content> tableContents = new LinkedList<>();
             int counter = 0;
@@ -492,7 +494,7 @@
             if (inhclass == typeElement) {
                 continue;
             }
-            SortedSet<Element> inhmembers = visibleMemberMap.getMembersFor(inhclass);
+            SortedSet<Element> inhmembers = asSortedSet(visibleMemberMap.getMembers(inhclass));
             if (!inhmembers.isEmpty()) {
                 Content inheritedTree = writer.getInheritedSummaryHeader(inhclass);
                 Content linksTree = writer.getInheritedSummaryLinksTree();
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -78,7 +78,7 @@
     /**
      * The methods being documented.
      */
-    private final SortedSet<Element> methods;
+    private final List<Element> methods;
 
 
     /**
@@ -98,7 +98,7 @@
                 typeElement,
                 VisibleMemberMap.Kind.METHODS,
                 configuration);
-        methods = visibleMemberMap.getLeafClassMembers();
+        methods = visibleMemberMap.getLeafMembers();
     }
 
     /**
@@ -124,27 +124,6 @@
     }
 
     /**
-     * Returns a list of methods that will be documented for the given class.
-     * This information can be used for doclet specific documentation
-     * generation.
-     *
-     * @param typeElement the {@link TypeElement} we want to check.
-     * @return a list of methods that will be documented.
-     */
-    public SortedSet<Element> members(TypeElement typeElement) {
-        return visibleMemberMap.getMembersFor(typeElement);
-    }
-
-    /**
-     * Returns the visible member map for the methods of this class.
-     *
-     * @return the visible member map for the methods of this class.
-     */
-    public VisibleMemberMap getVisibleMemberMap() {
-        return visibleMemberMap;
-    }
-
-    /**
      * {@inheritDoc}
      */
     @Override
@@ -163,18 +142,17 @@
         if (writer == null) {
             return;
         }
-        if (!methods.isEmpty()) {
+        if (hasMembersToDocument()) {
             Content methodDetailsTree = writer.getMethodDetailsTreeHeader(typeElement,
                     memberDetailsTree);
-            Set<Element> methodDetailSet = ((ConfigurationImpl)configuration).sortedMethodDetails
-                    ? methods
-                    : visibleMemberMap.getLeafClassMembersSourceOrder();
-            for (Element e : methodDetailSet) {
-                currentMethod = (ExecutableElement) e;
+
+            Element lastElement = methods.get(methods.size() - 1);
+            for (Element method : methods) {
+                currentMethod = (ExecutableElement)method;
                 Content methodDocTree = writer.getMethodDocTreeHeader(currentMethod, methodDetailsTree);
                 buildChildren(node, methodDocTree);
                 methodDetailsTree.addContent(writer.getMethodDoc(
-                        methodDocTree, currentMethod == methods.last()));
+                        methodDocTree, currentMethod == lastElement));
             }
             memberDetailsTree.addContent(writer.getMethodDetails(methodDetailsTree));
         }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java	Tue Nov 22 11:45:55 2016 -0800
@@ -69,7 +69,7 @@
     /**
      * The list of properties being documented.
      */
-    private final SortedSet<Element> properties;
+    private final List<Element> properties;
 
     /**
      * The index of the current property that is being documented at this point
@@ -95,7 +95,7 @@
                 typeElement,
                 VisibleMemberMap.Kind.PROPERTIES,
                 configuration);
-        properties = visibleMemberMap.getMembersFor(typeElement);
+        properties = visibleMemberMap.getMembers(typeElement);
     }
 
     /**
@@ -121,27 +121,6 @@
     }
 
     /**
-     * Returns a list of properties that will be documented for the given class.
-     * This information can be used for doclet specific documentation
-     * generation.
-     *
-     * @param typeElement the {@link TypeElement} we want to check.
-     * @return a list of properties that will be documented.
-     */
-    public SortedSet<Element> members(TypeElement typeElement) {
-        return visibleMemberMap.getMembersFor(typeElement);
-    }
-
-    /**
-     * Returns the visible member map for the properties of this class.
-     *
-     * @return the visible member map for the properties of this class.
-     */
-    public VisibleMemberMap getVisibleMemberMap() {
-        return visibleMemberMap;
-    }
-
-    /**
      * Returns whether or not there are members to document.
      *
      * @return whether or not there are members to document
@@ -162,17 +141,17 @@
         if (writer == null) {
             return;
         }
-        int size = properties.size();
-        if (size > 0) {
+        if (hasMembersToDocument()) {
             Content propertyDetailsTree = writer.getPropertyDetailsTreeHeader(typeElement,
                     memberDetailsTree);
-            for (Element e : properties) {
-                currentProperty = (ExecutableElement) e;
+            Element lastElement = properties.get(properties.size() - 1);
+            for (Element property : properties) {
+                currentProperty = (ExecutableElement)property;
                 Content propertyDocTree = writer.getPropertyDocTreeHeader(currentProperty,
                         propertyDetailsTree);
                 buildChildren(node, propertyDocTree);
                 propertyDetailsTree.addContent(writer.getPropertyDoc(
-                        propertyDocTree, currentProperty == properties.last()));
+                        propertyDocTree, currentProperty == lastElement));
             }
             memberDetailsTree.addContent(
                     writer.getPropertyDetails(propertyDetailsTree));
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java	Tue Nov 22 11:45:55 2016 -0800
@@ -25,7 +25,6 @@
 
 package jdk.javadoc.internal.doclets.toolkit.util;
 
-import java.io.IOException;
 import java.lang.annotation.Documented;
 import java.lang.ref.SoftReference;
 import java.text.CollationKey;
@@ -77,9 +76,7 @@
 import com.sun.source.util.TreePath;
 import jdk.javadoc.internal.doclets.toolkit.CommentUtils.DocCommentDuo;
 import jdk.javadoc.internal.doclets.toolkit.Configuration;
-import jdk.javadoc.internal.doclets.toolkit.DocletException;
 import jdk.javadoc.internal.doclets.toolkit.Messages;
-import jdk.javadoc.internal.doclets.toolkit.Resources;
 import jdk.javadoc.internal.doclets.toolkit.WorkArounds;
 
 import static javax.lang.model.element.ElementKind.*;
@@ -258,14 +255,6 @@
         return getEnclosingTypeElement(e) == null || isStatic(e);
     }
 
-    public boolean matches(Element e1, Element e2) {
-        if (isExecutableElement(e1) && isExecutableElement(e1)) {
-            return executableMembersEqual((ExecutableElement)e1, (ExecutableElement)e2);
-        } else {
-            return e1.getSimpleName().equals(e2.getSimpleName());
-        }
-    }
-
     /**
      * Copy doc-files directory and its contents from the source
      * package directory to the generated documentation directory.
@@ -2161,6 +2150,13 @@
         return convertToExecutableElement(getItems(e, false, METHOD));
     }
 
+    public int getOrdinalValue(VariableElement member) {
+        if (member == null || member.getKind() != ENUM_CONSTANT) {
+            throw new IllegalArgumentException("must be an enum constant: " + member);
+        }
+        return member.getEnclosingElement().getEnclosedElements().indexOf(member);
+    }
+
     public long getLineNumber(Element e) {
         TreePath path = getTreePath(e);
         if (path == null) { // maybe null if synthesized
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberMap.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberMap.java	Tue Nov 22 11:45:55 2016 -0800
@@ -220,48 +220,36 @@
     }
 
     /**
-     * Return the visible members of the class being mapped.  Also append at the
-     * end of the list members that are inherited by inaccessible parents. We
-     * document these members in the child because the parent is not documented.
+     * Returns a list of visible enclosed members of the type being mapped.
+     * This list may also contain appended members, inherited by inaccessible
+     * super types. These members are documented in the subtype when the
+     * super type is not documented.
      *
-     * @param configuration the current configuration of the doclet.
+     * @return a list of visible enclosed members
      */
-    public SortedSet<Element> getLeafClassMembers() {
-        SortedSet<Element> result = getMembersFor(typeElement);
-        result.addAll(getInheritedPackagePrivateMethods());
-        return result;
-    }
 
-    public Set<Element> getLeafClassMembersSourceOrder() {
-        Set<Element> result = new LinkedHashSet<>(classMap.get(typeElement).members);
+    public List<Element> getLeafMembers() {
+        List<Element> result = new ArrayList<>();
+        result.addAll(classMap.get(typeElement).members);
         result.addAll(getInheritedPackagePrivateMethods());
         return result;
     }
 
     /**
-     * Retrn the list of members for the given class.
+     * Returns a list of enclosed members for the given type.
      *
-     * @param typeElement the class to retrieve the list of visible members for.
+     * @param typeElement the given type
      *
-     * @return the list of members for the given class.
+     * @return a list of enclosed members
      */
-    public SortedSet<Element> getMembersFor(TypeElement typeElement) {
-        return asSortedSet(classMap.get(typeElement).members);
+    public List<Element> getMembers(TypeElement typeElement) {
+        return classMap.get(typeElement).members;
     }
 
-    public boolean hasMembersFor(TypeElement typeElement) {
+    public boolean hasMembers(TypeElement typeElement) {
         return !classMap.get(typeElement).members.isEmpty();
     }
 
-    private SortedSet<Element> asSortedSet(Collection<Element> in) {
-        if (in == null) {
-            return Collections.emptySortedSet();
-        }
-        TreeSet<Element> out = new TreeSet<>(comparator);
-        out.addAll(in);
-        return out;
-    }
-
     private void fillMemberLevelMap(List<? extends Element> list, String level) {
         for (Element element : list) {
             Object key = getMemberKey(element);
@@ -318,9 +306,9 @@
         private final TypeElement typeElement;
 
         /**
-         * List of inherited members from the mapping class.
+         * List of members from the mapping class.
          */
-        private Set<Element> members = new LinkedHashSet<>();
+        private List<Element> members = null;
 
         /**
          * Level/Depth of inheritance.
@@ -379,23 +367,23 @@
          * Adjust member-level-map, class-map.
          */
         private void addMembers(TypeElement fromClass) {
-            List<? extends Element> classMembers = getClassMembers(fromClass, true);
-            List<Element> incllist = new ArrayList<>();
-            for (Element element : classMembers) {
-                if (!found(members, element)) {
-                    if (memberIsVisible(element)) {
-                        if (!isOverridden(element, level)) {
-                            if (!utils.isHidden(element)) {
-                                incllist.add(element);
-                            }
+            List<Element> result = new ArrayList<>();
+            for (Element element : getClassMembers(fromClass, true)) {
+                if (memberIsVisible(element)) {
+                    if (!isOverridden(element, level)) {
+                        if (!utils.isHidden(element)) {
+                            result.add(element);
                         }
                     }
                 }
             }
-            if (!incllist.isEmpty()) {
+            if (members != null) {
+                throw new AssertionError("members should not be null");
+            }
+            members = Collections.unmodifiableList(result);
+            if (!members.isEmpty()) {
                 noVisibleMembers = false;
             }
-            members.addAll(incllist);
             fillMemberLevelMap(getClassMembers(fromClass, false), level);
         }
 
@@ -513,16 +501,6 @@
             return targetMembers;
         }
 
-        private boolean found(Iterable<Element> list, Element elem) {
-            for (Element pgmelem : list) {
-                if (utils.matches(pgmelem, elem)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-
         /**
          * Is member overridden? The member is overridden if it is found in the
          * same level hierarchy e.g. member at level "11" overrides member at
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java	Tue Nov 22 11:45:55 2016 -0800
@@ -939,6 +939,17 @@
             public void put(String name, String value) {
                 compOpts.put(name, value);
             }
+
+            @Override
+            public void remove(String name) {
+                compOpts.remove(name);
+            }
+
+            @Override
+            public boolean handleFileManagerOption(com.sun.tools.javac.main.Option option, String value) {
+                fileManagerOpts.put(option, value);
+                return true;
+            }
         };
     }
 
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java	Tue Nov 22 11:45:55 2016 -0800
@@ -57,63 +57,56 @@
     BOOTCLASSPATH("-bootclasspath", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.BOOT_CLASS_PATH, arg);
+            Option.BOOT_CLASS_PATH.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
     CLASS_PATH("--class-path -classpath -cp", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.CLASS_PATH, arg);
+            Option.CLASS_PATH.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
     EXTDIRS("-extdirs", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.EXTDIRS, arg);
+            Option.EXTDIRS.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
     SOURCE_PATH("--source-path -sourcepath", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.SOURCE_PATH, arg);
-        }
-    },
-
-    SYSCLASSPATH("-sysclasspath", HIDDEN, true) {
-        @Override
-        public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.BOOT_CLASS_PATH, arg);
+            Option.SOURCE_PATH.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
     MODULE_SOURCE_PATH("--module-source-path", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.MODULE_SOURCE_PATH, arg);
+            Option.MODULE_SOURCE_PATH.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
     UPGRADE_MODULE_PATH("--upgrade-module-path", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.UPGRADE_MODULE_PATH, arg);
+            Option.UPGRADE_MODULE_PATH.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
     SYSTEM("--system", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.SYSTEM, arg);
+            Option.SYSTEM.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
     MODULE_PATH("--module-path -p", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.MODULE_PATH, arg);
+            Option.MODULE_PATH.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
@@ -141,7 +134,7 @@
     ENCODING("-encoding", STANDARD, true) {
         @Override
         public void process(Helper helper, String arg) {
-            helper.setFileManagerOpt(Option.ENCODING, arg);
+            Option.ENCODING.process(helper.getOptionHelper(), primaryName, arg);
         }
     },
 
@@ -290,14 +283,6 @@
 
     // ----- output control options -----
 
-    PROMPT("-prompt", HIDDEN) {
-        @Override
-        public void process(Helper helper) {
-            helper.compOpts.put("-prompt", "-prompt");
-            helper.promptOnError = true;
-        }
-    },
-
     QUIET("-quiet", STANDARD) {
         @Override
         public void process(Helper helper) {
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java	Tue Nov 22 11:45:55 2016 -0800
@@ -89,6 +89,7 @@
                                List<Path> classpaths,
                                List<Archive> initialArchives,
                                boolean allDefaultModules,
+                               boolean allSystemModules,
                                Runtime.Version version)
         throws IOException
     {
@@ -107,6 +108,11 @@
                 roots.isEmpty() || allDefaultModules) {
             mods.addAll(systemModulePath.defaultSystemRoots());
         }
+        if (allSystemModules) {
+            systemModulePath.findAll().stream()
+                .map(mref -> mref.descriptor().name())
+                .forEach(mods::add);
+        }
 
         this.configuration = Configuration.empty()
                 .resolveRequires(finder, ModuleFinder.of(), mods);
@@ -488,6 +494,7 @@
         ModuleFinder appModulePath;
         boolean addAllApplicationModules;
         boolean addAllDefaultModules;
+        boolean addAllSystemModules;
         Runtime.Version version;
 
         public Builder() {
@@ -533,8 +540,7 @@
          * Include all system modules and modules found on modulepath
          */
         public Builder allModules() {
-            systemModulePath.moduleNames()
-                            .forEach(this.rootModules::add);
+            this.addAllSystemModules = true;
             this.addAllApplicationModules = true;
             return this;
         }
@@ -588,6 +594,7 @@
                                           classPaths,
                                           initialArchives,
                                           addAllDefaultModules,
+                                          addAllSystemModules,
                                           version);
         }
 
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java	Tue Nov 22 11:45:55 2016 -0800
@@ -25,8 +25,10 @@
 
 package com.sun.tools.jdeps;
 
+import com.sun.tools.jdeps.Analyzer.Type;
 import static com.sun.tools.jdeps.Analyzer.Type.*;
 import static com.sun.tools.jdeps.JdepsWriter.*;
+import static java.util.stream.Collectors.*;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -111,6 +113,10 @@
             this.aliases = aliases;
         }
 
+        Option(boolean hasArg, CommandOption cmd) {
+            this(hasArg, cmd.names());
+        }
+
         boolean isHidden() {
             return false;
         }
@@ -144,25 +150,46 @@
         }
     }
 
+    enum CommandOption {
+        ANALYZE_DEPS(""),
+        GENERATE_DOT_FILE("-dotoutput", "--dot-output"),
+        GENERATE_MODULE_INFO("--generate-module-info"),
+        LIST_DEPS("--list-deps"),
+        LIST_REDUCED_DEPS("--list-reduced-deps"),
+        CHECK_MODULES("--check");
+
+        private final String[] names;
+        CommandOption(String... names) {
+            this.names = names;
+        }
+
+        String[] names() {
+            return names;
+        }
+
+        @Override
+        public String toString() {
+            return names[0];
+        }
+    }
+
     static Option[] recognizedOptions = {
         new Option(false, "-h", "-?", "-help", "--help") {
             void process(JdepsTask task, String opt, String arg) {
                 task.options.help = true;
             }
         },
-        new Option(true, "-dotoutput", "--dot-output") {
+        new Option(true, CommandOption.GENERATE_DOT_FILE) {
             void process(JdepsTask task, String opt, String arg) throws BadArgs {
-                Path p = Paths.get(arg);
-                if (Files.exists(p) && (!Files.isDirectory(p) || !Files.isWritable(p))) {
-                    throw new BadArgs("err.invalid.path", arg);
+                if (task.command != null) {
+                    throw new BadArgs("err.command.set", task.command, opt);
                 }
-                task.options.dotOutputDir = Paths.get(arg);;
+                task.command = task.genDotFile(Paths.get(arg));
             }
         },
         new Option(false, "-s", "-summary") {
             void process(JdepsTask task, String opt, String arg) {
                 task.options.showSummary = true;
-                task.options.verbose = SUMMARY;
             }
         },
         new Option(false, "-v", "-verbose",
@@ -196,35 +223,48 @@
                 task.options.apiOnly = true;
             }
         },
-        new Option(true, "--check") {
-            void process(JdepsTask task, String opt, String arg) throws BadArgs {
-                Set<String> mods =  Set.of(arg.split(","));
-                task.options.checkModuleDeps = mods;
-                task.options.addmods.addAll(mods);
-            }
-        },
-        new Option(true, "--generate-module-info") {
-            void process(JdepsTask task, String opt, String arg) throws BadArgs {
-                Path p = Paths.get(arg);
-                if (Files.exists(p) && (!Files.isDirectory(p) || !Files.isWritable(p))) {
-                    throw new BadArgs("err.invalid.path", arg);
-                }
-                task.options.genModuleInfo = Paths.get(arg);
-            }
-        },
+
         new Option(false, "-jdkinternals", "--jdk-internals") {
             void process(JdepsTask task, String opt, String arg) {
                 task.options.findJDKInternals = true;
-                task.options.verbose = CLASS;
                 if (task.options.includePattern == null) {
                     task.options.includePattern = Pattern.compile(".*");
                 }
             }
         },
-        new Option(false, "--list-deps", "--list-reduced-deps") {
-            void process(JdepsTask task, String opt, String arg) {
-                task.options.showModulesAddExports = true;
-                task.options.reduced = opt.equals("--list-reduced-deps");
+
+        new Option(true, CommandOption.CHECK_MODULES) {
+            void process(JdepsTask task, String opt, String arg) throws BadArgs {
+                if (task.command != null) {
+                    throw new BadArgs("err.command.set", task.command, opt);
+                }
+                Set<String> mods =  Set.of(arg.split(","));
+                task.options.addmods.addAll(mods);
+                task.command = task.checkModuleDeps(mods);
+            }
+        },
+        new Option(true, CommandOption.GENERATE_MODULE_INFO) {
+            void process(JdepsTask task, String opt, String arg) throws BadArgs {
+                if (task.command != null) {
+                    throw new BadArgs("err.command.set", task.command, opt);
+                }
+                task.command = task.genModuleInfo(Paths.get(arg));
+            }
+        },
+        new Option(false, CommandOption.LIST_DEPS) {
+            void process(JdepsTask task, String opt, String arg) throws BadArgs {
+                if (task.command != null) {
+                    throw new BadArgs("err.command.set", task.command, opt);
+                }
+                task.command = task.listModuleDeps(false);
+            }
+        },
+        new Option(false, CommandOption.LIST_REDUCED_DEPS) {
+            void process(JdepsTask task, String opt, String arg) throws BadArgs {
+                if (task.command != null) {
+                    throw new BadArgs("err.command.set", task.command, opt);
+                }
+                task.command = task.listModuleDeps(true);
             }
         },
 
@@ -419,6 +459,7 @@
     private final Options options = new Options();
     private final List<String> inputArgs = new ArrayList<>();
 
+    private Command command;
     private PrintWriter log;
     void setLog(PrintWriter out) {
         log = out;
@@ -445,55 +486,30 @@
             if (options.version || options.fullVersion) {
                 showVersion(options.fullVersion);
             }
+            if (options.help || options.version || options.fullVersion) {
+                return EXIT_OK;
+            }
+
             if (!inputArgs.isEmpty() && options.rootModule != null) {
                 reportError("err.invalid.arg.for.option", "-m");
             }
-            if (inputArgs.isEmpty() && options.addmods.isEmpty() && options.includePattern == null
-                    && options.includeSystemModulePattern == null && options.checkModuleDeps == null) {
-                if (options.help || options.version || options.fullVersion) {
-                    return EXIT_OK;
-                } else {
-                    showHelp();
-                    return EXIT_CMDERR;
-                }
-            }
-            if (options.genModuleInfo != null) {
-                if (options.dotOutputDir != null || options.classpath != null || options.hasFilter()) {
-                    showHelp();
-                    return EXIT_CMDERR;
-                }
-            }
 
             if (options.numFilters() > 1) {
                 reportError("err.invalid.filters");
                 return EXIT_CMDERR;
             }
 
-            if (options.inverse && options.depth != 1) {
-                reportError("err.invalid.inverse.option", "-R");
-                return EXIT_CMDERR;
-            }
-
-            if (options.inverse && options.numFilters() == 0) {
-                reportError("err.invalid.filters");
-                return EXIT_CMDERR;
+            // default command to analyze dependences
+            if (command == null) {
+                command = analyzeDeps();
             }
-
-            if ((options.findJDKInternals) && (options.hasFilter() || options.showSummary)) {
-                showHelp();
-                return EXIT_CMDERR;
-            }
-            if (options.showSummary && options.verbose != SUMMARY) {
-                showHelp();
-                return EXIT_CMDERR;
-            }
-            if (options.checkModuleDeps != null && !inputArgs.isEmpty()) {
-                reportError("err.invalid.module.option", inputArgs, "--check");
+            if (!command.checkOptions()) {
                 return EXIT_CMDERR;
             }
 
             boolean ok = run();
             return ok ? EXIT_OK : EXIT_ERROR;
+
         } catch (BadArgs|UncheckedBadArgs e) {
             reportError(e.getKey(), e.getArgs());
             if (e.showUsage()) {
@@ -515,13 +531,14 @@
     }
 
     boolean run() throws IOException {
-        try (JdepsConfiguration config = buildConfig()) {
+        try (JdepsConfiguration config = buildConfig(command.allModules())) {
 
             // detect split packages
-            config.splitPackages().entrySet().stream()
+            config.splitPackages().entrySet()
+                .stream()
                 .sorted(Map.Entry.comparingByKey())
                 .forEach(e -> System.out.format("split package: %s %s%n", e.getKey(),
-                    e.getValue().toString()));
+                                                e.getValue().toString()));
 
             // check if any module specified in --require is missing
             Stream.concat(options.addmods.stream(), options.requires.stream())
@@ -529,38 +546,11 @@
                 .forEach(mn -> config.findModule(mn).orElseThrow(() ->
                     new UncheckedBadArgs(new BadArgs("err.module.not.found", mn))));
 
-            // --generate-module-info
-            if (options.genModuleInfo != null) {
-                return genModuleInfo(config);
-            }
-
-            // --check
-            if (options.checkModuleDeps != null) {
-                return new ModuleAnalyzer(config, log, options.checkModuleDeps).run();
-            }
-
-            if (options.showModulesAddExports) {
-                return new ModuleExportsAnalyzer(config,
-                                                 dependencyFilter(config),
-                                                 options.reduced,
-                                                 log).run();
-            }
-
-            if (options.dotOutputDir != null &&
-                (options.verbose == SUMMARY || options.verbose == MODULE) &&
-                !options.addmods.isEmpty() && inputArgs.isEmpty()) {
-                return new ModuleAnalyzer(config, log).genDotFiles(options.dotOutputDir);
-            }
-
-            if (options.inverse) {
-                return analyzeInverseDeps(config);
-            } else {
-                return analyzeDeps(config);
-            }
+            return command.run(config);
         }
     }
 
-    private JdepsConfiguration buildConfig() throws IOException {
+    private JdepsConfiguration buildConfig(boolean allModules) throws IOException {
         JdepsConfiguration.Builder builder =
             new JdepsConfiguration.Builder(options.systemModulePath);
 
@@ -568,7 +558,7 @@
                .appModulePath(options.modulePath)
                .addmods(options.addmods);
 
-        if (options.checkModuleDeps != null || options.showModulesAddExports) {
+        if (allModules) {
             // check all system modules in the image
             builder.allModules();
         }
@@ -592,148 +582,421 @@
         return builder.build();
     }
 
-    private boolean analyzeDeps(JdepsConfiguration config) throws IOException {
-        // output result
-        final JdepsWriter writer;
-        if (options.dotOutputDir != null) {
-            writer = new DotFileWriter(options.dotOutputDir,
-                                       options.verbose,
-                                       options.showProfile,
-                                       options.showModule,
-                                       options.showLabel);
-        } else {
-            writer = new SimpleWriter(log,
-                                      options.verbose,
-                                      options.showProfile,
-                                      options.showModule);
+    // ---- factory methods to create a Command
+
+    private AnalyzeDeps analyzeDeps() throws BadArgs {
+        return options.inverse ? new InverseAnalyzeDeps()
+                               : new AnalyzeDeps();
+    }
+
+    private GenDotFile genDotFile(Path dir) throws BadArgs {
+        if (Files.exists(dir) && (!Files.isDirectory(dir) || !Files.isWritable(dir))) {
+            throw new BadArgs("err.invalid.path", dir.toString());
+        }
+        return new GenDotFile(dir);
+    }
+
+    private GenModuleInfo genModuleInfo(Path dir) throws BadArgs {
+        if (Files.exists(dir) && (!Files.isDirectory(dir) || !Files.isWritable(dir))) {
+            throw new BadArgs("err.invalid.path", dir.toString());
+        }
+        return new GenModuleInfo(dir);
+    }
+
+    private ListModuleDeps listModuleDeps(boolean reduced) throws BadArgs {
+        return reduced ? new ListReducedDeps()
+                       : new ListModuleDeps();
+    }
+
+    private CheckModuleDeps checkModuleDeps(Set<String> mods) throws BadArgs {
+        return new CheckModuleDeps(mods);
+    }
+
+    abstract class Command {
+        final CommandOption option;
+        protected Command(CommandOption option) {
+            this.option = option;
+        }
+        /**
+         * Returns true if the command-line options are all valid;
+         * otherwise, returns false.
+         */
+        abstract boolean checkOptions();
+
+        /**
+         * Do analysis
+         */
+        abstract boolean run(JdepsConfiguration config) throws IOException;
+
+        /**
+         * Includes all modules on system module path and application module path
+         */
+        boolean allModules() {
+            return false;
+        }
+
+        @Override
+        public String toString() {
+            return option.toString();
+        }
+    }
+
+
+    /**
+     * Analyze dependences
+     */
+    class AnalyzeDeps extends Command {
+        JdepsWriter writer;
+        AnalyzeDeps() {
+            this(CommandOption.ANALYZE_DEPS);
+        }
+
+        AnalyzeDeps(CommandOption option) {
+            super(option);
+        }
+
+        @Override
+        boolean checkOptions() {
+            if (options.findJDKInternals) {
+                // cannot set any filter, -verbose and -summary option
+                if (options.showSummary || options.verbose != null) {
+                    reportError("err.invalid.options", "-summary or -verbose",
+                                "-jdkinternals");
+                    return false;
+                }
+                if (options.hasFilter()) {
+                    reportError("err.invalid.options", "--package, --regex, --require",
+                                "-jdkinternals");
+                    return false;
+                }
+            }
+            if (options.showSummary) {
+                // -summary cannot use with -verbose option
+                if (options.verbose != null) {
+                    reportError("err.invalid.options", "-v, -verbose", "-s, -summary");
+                    return false;
+                }
+            }
+            if (inputArgs.isEmpty() && !options.hasSourcePath()) {
+                showHelp();
+                return false;
+            }
+            return true;
+        }
+
+        /*
+         * Default is to show package-level dependencies
+         */
+        Type getAnalyzerType() {
+            if (options.showSummary)
+                return Type.SUMMARY;
+
+            if (options.findJDKInternals)
+                return Type.CLASS;
+
+            // default to package-level verbose
+           return options.verbose != null ? options.verbose : PACKAGE;
+        }
+
+        @Override
+        boolean run(JdepsConfiguration config) throws IOException {
+            Type type = getAnalyzerType();
+            // default to package-level verbose
+            JdepsWriter writer = new SimpleWriter(log,
+                                                  type,
+                                                  options.showProfile,
+                                                  options.showModule);
+
+            return run(config, writer, type);
         }
 
-        // analyze the dependencies
-        DepsAnalyzer analyzer = new DepsAnalyzer(config,
-                                                 dependencyFilter(config),
-                                                 writer,
-                                                 options.verbose,
-                                                 options.apiOnly);
+        boolean run(JdepsConfiguration config, JdepsWriter writer, Type type) throws IOException {
+
+
+            // analyze the dependencies
+            DepsAnalyzer analyzer = new DepsAnalyzer(config,
+                                                     dependencyFilter(config),
+                                                     writer,
+                                                     type,
+                                                     options.apiOnly);
+
+            boolean ok = analyzer.run(options.compileTimeView, options.depth);
+
+            // print skipped entries, if any
+            if (!options.nowarning) {
+                analyzer.archives()
+                    .forEach(archive -> archive.reader()
+                        .skippedEntries().stream()
+                        .forEach(name -> warning("warn.skipped.entry", name)));
+            }
+
+            if (options.findJDKInternals && !options.nowarning) {
+                Map<String, String> jdkInternals = new TreeMap<>();
+                Set<String> deps = analyzer.dependences();
+                // find the ones with replacement
+                deps.forEach(cn -> replacementFor(cn).ifPresent(
+                    repl -> jdkInternals.put(cn, repl))
+                );
+
+                if (!deps.isEmpty()) {
+                    log.println();
+                    warning("warn.replace.useJDKInternals", getMessage("jdeps.wiki.url"));
+                }
 
-        boolean ok = analyzer.run(options.compileTimeView, options.depth);
+                if (!jdkInternals.isEmpty()) {
+                    log.println();
+                    log.format("%-40s %s%n", "JDK Internal API", "Suggested Replacement");
+                    log.format("%-40s %s%n", "----------------", "---------------------");
+                    jdkInternals.entrySet().stream()
+                        .forEach(e -> {
+                            String key = e.getKey();
+                            String[] lines = e.getValue().split("\\n");
+                            for (String s : lines) {
+                                log.format("%-40s %s%n", key, s);
+                                key = "";
+                            }
+                        });
+                }
+            }
+            return ok;
+        }
+    }
+
 
-        // print skipped entries, if any
-        if (!options.nowarning) {
-            analyzer.archives()
-                .forEach(archive -> archive.reader()
-                    .skippedEntries().stream()
-                    .forEach(name -> warning("warn.skipped.entry", name)));
+    class InverseAnalyzeDeps extends AnalyzeDeps {
+        InverseAnalyzeDeps() {
+        }
+
+        @Override
+        boolean checkOptions() {
+            if (options.depth != 1) {
+                reportError("err.invalid.options", "-R", "--inverse");
+                return false;
+            }
+
+            if (options.numFilters() == 0) {
+                reportError("err.filter.not.specified");
+                return false;
+            }
+
+            if (!super.checkOptions()) {
+                return false;
+            }
+
+            return true;
         }
 
-        if (options.findJDKInternals && !options.nowarning) {
-            Map<String, String> jdkInternals = new TreeMap<>();
-            Set<String> deps = analyzer.dependences();
-            // find the ones with replacement
-            deps.forEach(cn -> replacementFor(cn).ifPresent(
-                repl -> jdkInternals.put(cn, repl))
-            );
+        @Override
+        boolean run(JdepsConfiguration config) throws IOException {
+            Type type = getAnalyzerType();
+
+            InverseDepsAnalyzer analyzer =
+                new InverseDepsAnalyzer(config,
+                                        dependencyFilter(config),
+                                        writer,
+                                        type,
+                                        options.apiOnly);
+            boolean ok = analyzer.run();
+
+            log.println();
+            if (!options.requires.isEmpty())
+                log.format("Inverse transitive dependences on %s%n", options.requires);
+            else
+                log.format("Inverse transitive dependences matching %s%n",
+                    options.regex != null
+                        ? options.regex.toString()
+                        : "packages " + options.packageNames);
+
+            analyzer.inverseDependences().stream()
+                .sorted(Comparator.comparing(this::sortPath))
+                .forEach(path -> log.println(path.stream()
+                    .map(Archive::getName)
+                    .collect(joining(" <- "))));
+            return ok;
+        }
+
+        private String sortPath(Deque<Archive> path) {
+            return path.peekFirst().getName();
+        }
+    }
+
 
-            if (!deps.isEmpty()) {
-                log.println();
-                warning("warn.replace.useJDKInternals", getMessage("jdeps.wiki.url"));
+    class GenModuleInfo extends Command {
+        final Path dir;
+        GenModuleInfo(Path dir) {
+            super(CommandOption.GENERATE_MODULE_INFO);
+            this.dir = dir;
+        }
+
+        @Override
+        boolean checkOptions() {
+            if (options.classpath != null) {
+                reportError("err.invalid.options", "-classpath",
+                            option);
+                return false;
+            }
+            if (options.hasFilter()) {
+                reportError("err.invalid.options", "--package, --regex, --require",
+                            option);
+                return false;
+            }
+            return true;
+        }
+
+        @Override
+        boolean run(JdepsConfiguration config) throws IOException {
+            // check if any JAR file contains unnamed package
+            for (String arg : inputArgs) {
+                try (ClassFileReader reader = ClassFileReader.newInstance(Paths.get(arg))) {
+                    Optional<String> classInUnnamedPackage =
+                        reader.entries().stream()
+                             .filter(n -> n.endsWith(".class"))
+                             .filter(cn -> toPackageName(cn).isEmpty())
+                             .findFirst();
+
+                    if (classInUnnamedPackage.isPresent()) {
+                        if (classInUnnamedPackage.get().equals("module-info.class")) {
+                            reportError("err.genmoduleinfo.not.jarfile", arg);
+                        } else {
+                            reportError("err.genmoduleinfo.unnamed.package", arg);
+                        }
+                        return false;
+                    }
+                }
             }
 
-            if (!jdkInternals.isEmpty()) {
-                log.println();
-                log.format("%-40s %s%n", "JDK Internal API", "Suggested Replacement");
-                log.format("%-40s %s%n", "----------------", "---------------------");
-                jdkInternals.entrySet().stream()
-                    .forEach(e -> {
-                        String key = e.getKey();
-                        String[] lines = e.getValue().split("\\n");
-                        for (String s : lines) {
-                            log.format("%-40s %s%n", key, s);
-                            key = "";
+            ModuleInfoBuilder builder
+                 = new ModuleInfoBuilder(config, inputArgs, dir);
+            boolean ok = builder.run();
+
+            if (!ok && !options.nowarning) {
+                log.println("ERROR: missing dependencies");
+                builder.visitMissingDeps(
+                    new Analyzer.Visitor() {
+                        @Override
+                        public void visitDependence(String origin, Archive originArchive,
+                                                    String target, Archive targetArchive) {
+                            if (builder.notFound(targetArchive))
+                                log.format("   %-50s -> %-50s %s%n",
+                                    origin, target, targetArchive.getName());
                         }
                     });
             }
+            return ok;
         }
-        return ok;
+
+        private String toPackageName(String name) {
+            int i = name.lastIndexOf('/');
+            return i > 0 ? name.replace('/', '.').substring(0, i) : "";
+        }
     }
 
-    private boolean analyzeInverseDeps(JdepsConfiguration config) throws IOException {
-        JdepsWriter writer = new SimpleWriter(log,
-                                              options.verbose,
-                                              options.showProfile,
-                                              options.showModule);
-
-        InverseDepsAnalyzer analyzer = new InverseDepsAnalyzer(config,
-                                                               dependencyFilter(config),
-                                                               writer,
-                                                               options.verbose,
-                                                               options.apiOnly);
-        boolean ok = analyzer.run();
+    class CheckModuleDeps extends Command {
+        final Set<String> modules;
+        CheckModuleDeps(Set<String> mods) {
+            super(CommandOption.CHECK_MODULES);
+            this.modules = mods;
+        }
 
-        log.println();
-        if (!options.requires.isEmpty())
-            log.format("Inverse transitive dependences on %s%n", options.requires);
-        else
-            log.format("Inverse transitive dependences matching %s%n",
-                options.regex != null
-                    ? options.regex.toString()
-                    : "packages " + options.packageNames);
+        @Override
+        boolean checkOptions() {
+            if (!inputArgs.isEmpty()) {
+                reportError("err.invalid.options", inputArgs, "--check");
+                return false;
+            }
+            return true;
+        }
 
-        analyzer.inverseDependences().stream()
-                .sorted(Comparator.comparing(this::sortPath))
-                .forEach(path -> log.println(path.stream()
-                                                .map(Archive::getName)
-                                                .collect(Collectors.joining(" <- "))));
-        return ok;
+        @Override
+        boolean run(JdepsConfiguration config) throws IOException {
+            if (!config.initialArchives().isEmpty()) {
+                String list = config.initialArchives().stream()
+                                    .map(Archive::getPathName).collect(joining(" "));
+                throw new UncheckedBadArgs(new BadArgs("err.invalid.options",
+                                                       list, "--check"));
+            }
+            return new ModuleAnalyzer(config, log, modules).run();
+        }
+
+        public boolean allModules() {
+            return true;
+        }
     }
 
-    private String sortPath(Deque<Archive> path) {
-        return path.peekFirst().getName();
+    class ListReducedDeps extends ListModuleDeps {
+        ListReducedDeps() {
+            super(CommandOption.LIST_REDUCED_DEPS, true);
+        }
     }
 
-    private boolean genModuleInfo(JdepsConfiguration config) throws IOException {
-        // check if any JAR file contains unnamed package
-        for (String arg : inputArgs) {
-            try (ClassFileReader reader = ClassFileReader.newInstance(Paths.get(arg))) {
-                Optional<String> classInUnnamedPackage =
-                    reader.entries().stream()
-                        .filter(n -> n.endsWith(".class"))
-                        .filter(cn -> toPackageName(cn).isEmpty())
-                        .findFirst();
+    class ListModuleDeps extends Command {
+        final boolean reduced;
+        ListModuleDeps() {
+            this(CommandOption.LIST_DEPS, false);
+        }
+        ListModuleDeps(CommandOption option, boolean reduced) {
+            super(option);
+            this.reduced = reduced;
+        }
 
-                if (classInUnnamedPackage.isPresent()) {
-                    if (classInUnnamedPackage.get().equals("module-info.class")) {
-                        reportError("err.genmoduleinfo.not.jarfile", arg);
-                    } else {
-                        reportError("err.genmoduleinfo.unnamed.package", arg);
-                    }
-                    return false;
-                }
+        @Override
+        boolean checkOptions() {
+            if (options.showSummary || options.verbose != null) {
+                reportError("err.invalid.options", "-summary or -verbose",
+                            option);
+                return false;
             }
+            if (options.findJDKInternals) {
+                reportError("err.invalid.options", "-jdkinternals",
+                            option);
+                return false;
+            }
+            if (inputArgs.isEmpty() && !options.hasSourcePath()) {
+                showHelp();
+                return false;
+            }
+            return true;
         }
 
-        ModuleInfoBuilder builder
-            = new ModuleInfoBuilder(config, inputArgs, options.genModuleInfo);
-        boolean ok = builder.run();
+        @Override
+        boolean run(JdepsConfiguration config) throws IOException {
+            return new ModuleExportsAnalyzer(config,
+                                             dependencyFilter(config),
+                                             reduced,
+                                             log).run();
+        }
 
-        if (!ok && !options.nowarning) {
-            log.println("ERROR: missing dependencies");
-            builder.visitMissingDeps(
-                new Analyzer.Visitor() {
-                    @Override
-                    public void visitDependence(String origin, Archive originArchive,
-                                                String target, Archive targetArchive) {
-                        if (builder.notFound(targetArchive))
-                            log.format("   %-50s -> %-50s %s%n",
-                                origin, target, targetArchive.getName());
-                    }
-                });
+        @Override
+        boolean allModules() {
+            return true;
         }
-        return ok;
     }
 
-    private String toPackageName(String name) {
-        int i = name.lastIndexOf('/');
-        return i > 0 ? name.replace('/', '.').substring(0, i) : "";
+
+    class GenDotFile extends AnalyzeDeps {
+        final Path dotOutputDir;
+        GenDotFile(Path dotOutputDir) {
+            super(CommandOption.GENERATE_DOT_FILE);
+
+            this.dotOutputDir = dotOutputDir;
+        }
+
+        @Override
+        boolean run(JdepsConfiguration config) throws IOException {
+            if ((options.showSummary || options.verbose == MODULE) &&
+                !options.addmods.isEmpty() && inputArgs.isEmpty()) {
+                // print module descriptor
+                return new ModuleAnalyzer(config, log).genDotFiles(dotOutputDir);
+            }
+
+            Type type = getAnalyzerType();
+            JdepsWriter writer = new DotFileWriter(dotOutputDir,
+                                                   type,
+                                                   options.showProfile,
+                                                   options.showModule,
+                                                   options.showLabel);
+            return run(config, writer, type);
+        }
     }
 
     /**
@@ -875,14 +1138,11 @@
         boolean showLabel;
         boolean findJDKInternals;
         boolean nowarning = false;
-        // default is to show package-level dependencies
-        // and filter references from same package
-        Analyzer.Type verbose = PACKAGE;
+        Analyzer.Type verbose;
+        // default filter references from same package
         boolean filterSamePackage = true;
         boolean filterSameArchive = false;
         Pattern filterRegex;
-        Path dotOutputDir;
-        Path genModuleInfo;
         String classpath;
         int depth = 1;
         Set<String> requires = new HashSet<>();
@@ -892,15 +1152,17 @@
         Pattern includeSystemModulePattern;
         boolean inverse = false;
         boolean compileTimeView = false;
-        Set<String> checkModuleDeps;
         String systemModulePath = System.getProperty("java.home");
         String upgradeModulePath;
         String modulePath;
         String rootModule;
         Set<String> addmods = new HashSet<>();
         Runtime.Version multiRelease;
-        boolean showModulesAddExports;
-        boolean reduced;
+
+        boolean hasSourcePath() {
+            return !addmods.isEmpty() || includePattern != null ||
+                        includeSystemModulePattern != null;
+        }
 
         boolean hasFilter() {
             return numFilters() > 0;
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Module.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Module.java	Tue Nov 22 11:45:55 2016 -0800
@@ -81,7 +81,7 @@
      * Returns module name
      */
     public String name() {
-        return descriptor.name();
+        return descriptor != null ? descriptor.name() : getName();
     }
 
     public boolean isNamed() {
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleAnalyzer.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleAnalyzer.java	Tue Nov 22 11:45:55 2016 -0800
@@ -70,14 +70,6 @@
     public ModuleAnalyzer(JdepsConfiguration config,
                           PrintWriter log,
                           Set<String> names) {
-
-        if (!config.initialArchives().isEmpty()) {
-            String list = config.initialArchives().stream()
-                .map(Archive::getPathName).collect(joining(" "));
-            throw new JdepsTask.UncheckedBadArgs(new BadArgs("err.invalid.module.option",
-                list, "--check"));
-        }
-
         this.configuration = config;
         this.log = log;
 
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java	Tue Nov 22 11:45:55 2016 -0800
@@ -33,6 +33,7 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import static com.sun.tools.jdeps.Analyzer.NOT_FOUND;
 
@@ -140,20 +141,34 @@
         Set<Module> modules = builder.build().adjacentNodes(root);
 
         // if reduced is set, apply transition reduction
-        Set<Module> reducedSet = reduced ? builder.reduced().adjacentNodes(root)
-                                         : modules;
+        Set<Module> reducedSet;
+        if (reduced) {
+            Set<Module> nodes = builder.reduced().adjacentNodes(root);
+            if (nodes.size() == 1) {
+                // java.base only
+                reducedSet = nodes;
+            } else {
+                // java.base is mandated and can be excluded from the reduced graph
+                reducedSet = nodes.stream()
+                    .filter(m -> !"java.base".equals(m.name()) ||
+                                    jdkinternals.containsKey("java.base"))
+                    .collect(Collectors.toSet());
+            }
+        } else {
+            reducedSet = modules;
+        }
 
         modules.stream()
                .sorted(Comparator.comparing(Module::name))
                .forEach(m -> {
-                if (jdkinternals.containsKey(m)) {
-                    jdkinternals.get(m).stream()
-                        .sorted()
-                        .forEach(pn -> writer.format("   %s/%s%n", m, pn));
-                } else if (reducedSet.contains(m)){
-                    // if the transition reduction is applied, show the reduced graph
-                    writer.format("   %s%n", m);
-                }
+                    if (jdkinternals.containsKey(m)) {
+                        jdkinternals.get(m).stream()
+                            .sorted()
+                            .forEach(pn -> writer.format("   %s/%s%n", m, pn));
+                    } else if (reducedSet.contains(m)){
+                        // if the transition reduction is applied, show the reduced graph
+                        writer.format("   %s%n", m);
+                    }
             });
     }
 
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties	Tue Nov 22 11:45:55 2016 -0800
@@ -151,7 +151,9 @@
 
 main.opt.list-deps=\
 \  --list-deps                   Lists the dependences and use of JDK internal\n\
-\                                APIs.\n\
+\                                APIs.
+
+main.opt.list-reduced-deps=\
 \  --list-reduced-deps           Same as --list-deps with not listing\n\
 \                                the implied reads edges from the module graph\n\
 \                                If module M1 depends on M2 and M3,\n\
@@ -171,6 +173,7 @@
 \                                multi-release jar files.  <version> should\n\
 \                                be integer >= 9 or base.
 
+err.command.set={0} and {1} options are specified.
 err.unknown.option=unknown option: {0}
 err.missing.arg=no value given for {0}
 err.invalid.arg.for.option=invalid argument for option: {0}
@@ -180,11 +183,10 @@
 err.profiles.msg=No profile information
 err.exception.message={0}
 err.invalid.path=invalid path: {0}
-err.invalid.module.option=Cannot set {0} with {1} option.
-err.invalid.filters=Only one of --package (-p), --regex (-e), --require option can be set
+err.invalid.options={0} cannot be used with {1} option
 err.module.not.found=module not found: {0}
 err.root.module.not.set=root module set empty
-err.invalid.inverse.option={0} cannot be used with --inverse option
+err.filter.not.specified=--package (-p), --regex (-e), --require option must be specified
 err.multirelease.option.exists={0} is not a multi-release jar file, but the --multi-release option is set
 err.multirelease.option.notfound={0} is a multi-release jar file, but the --multi-release option is not set
 err.multirelease.version.associated=class {0} already associated with version {1}, trying to add version {2}
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java	Tue Nov 22 11:45:55 2016 -0800
@@ -57,7 +57,6 @@
 import jdk.internal.jline.TerminalSupport;
 import jdk.internal.jline.WindowsTerminal;
 import jdk.internal.jline.console.ConsoleReader;
-import jdk.internal.jline.console.CursorBuffer;
 import jdk.internal.jline.console.KeyMap;
 import jdk.internal.jline.console.UserInterruptException;
 import jdk.internal.jline.console.completer.Completer;
@@ -581,26 +580,55 @@
 
     private static final FixComputer[] FIX_COMPUTERS = new FixComputer[] {
         new FixComputer('v', false) { //compute "Introduce variable" Fix:
+            private void performToVar(ConsoleReader in, String type) throws IOException {
+                in.redrawLine();
+                in.setCursorPosition(0);
+                in.putString(type + "  = ");
+                in.setCursorPosition(in.getCursorBuffer().cursor - 3);
+                in.flush();
+            }
+
             @Override
             public FixResult compute(JShellTool repl, String code, int cursor) {
                 String type = repl.analysis.analyzeType(code, cursor);
                 if (type == null) {
                     return new FixResult(Collections.emptyList(), null);
                 }
-                return new FixResult(Collections.singletonList(new Fix() {
+                List<Fix> fixes = new ArrayList<>();
+                fixes.add(new Fix() {
                     @Override
                     public String displayName() {
                         return repl.messageFormat("jshell.console.create.variable");
                     }
+
                     @Override
                     public void perform(ConsoleReader in) throws IOException {
-                        in.redrawLine();
-                        in.setCursorPosition(0);
-                        in.putString(type + "  = ");
-                        in.setCursorPosition(in.getCursorBuffer().cursor - 3);
-                        in.flush();
+                        performToVar(in, type);
                     }
-                }), null);
+                });
+                int idx = type.lastIndexOf(".");
+                if (idx > 0) {
+                    String stype = type.substring(idx + 1);
+                    QualifiedNames res = repl.analysis.listQualifiedNames(stype, stype.length());
+                    if (res.isUpToDate() && res.getNames().contains(type)
+                            && !res.isResolvable()) {
+                        fixes.add(new Fix() {
+                            @Override
+                            public String displayName() {
+                                return "import: " + type + ". " +
+                                        repl.messageFormat("jshell.console.create.variable");
+                            }
+
+                            @Override
+                            public void perform(ConsoleReader in) throws IOException {
+                                repl.state.eval("import " + type + ";");
+                                in.println("Imported: " + type);
+                                performToVar(in, stype);
+                            }
+                        });
+                    }
+                }
+                return new FixResult(fixes, null);
             }
         },
         new FixComputer('i', true) { //compute "Add import" Fixes:
@@ -614,6 +642,7 @@
                         public String displayName() {
                             return "import: " + fqn;
                         }
+
                         @Override
                         public void perform(ConsoleReader in) throws IOException {
                             repl.state.eval("import " + fqn + ";");
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java	Tue Nov 22 11:45:55 2016 -0800
@@ -29,6 +29,7 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.OutputStream;
+import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.ArrayList;
@@ -111,7 +112,7 @@
      */
     private static ExecutionControl create(ExecutionEnv env,
             boolean isLaunch, String host) throws IOException {
-        try (final ServerSocket listener = new ServerSocket(0)) {
+        try (final ServerSocket listener = new ServerSocket(0, 1, InetAddress.getLoopbackAddress())) {
             // timeout after 60 seconds
             listener.setSoTimeout(60000);
             int port = listener.getLocalPort();
--- a/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java	Tue Nov 22 11:45:55 2016 -0800
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363
+ * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363 8167967
  * @summary Test of the JavaFX doclet features.
  * @author jvalenta
  * @library ../lib
@@ -163,10 +163,7 @@
                 "pkg2");
         checkExit(Exit.OK);
         checkOutput("pkg2/Test.html", true,
-                "<li class=\"blockList\"><a name=\"property.detail\">\n"
-                + "<!--   -->\n"
-                + "</a>\n"
-                + "<h3>Property Detail</h3>\n"
+                "<h3>Property Detail</h3>\n"
                 + "<a name=\"betaProperty\">\n"
                 + "<!--   -->\n"
                 + "</a>\n"
@@ -176,27 +173,27 @@
                 + "<pre>public&nbsp;java.lang.Object betaProperty</pre>\n"
                 + "</li>\n"
                 + "</ul>\n"
+                + "<a name=\"gammaProperty\">\n"
+                + "<!--   -->\n"
+                + "</a>\n"
+                + "<ul class=\"blockList\">\n"
+                + "<li class=\"blockList\">\n"
+                + "<h4>gamma</h4>\n"
+                + "<pre>public final&nbsp;java.util.List&lt;java.lang.String&gt; gammaProperty</pre>\n"
+                + "</li>\n"
+                + "</ul>\n"
                 + "<a name=\"deltaProperty\">\n"
                 + "<!--   -->\n"
                 + "</a>\n"
-                + "<ul class=\"blockList\">\n"
+                + "<ul class=\"blockListLast\">\n"
                 + "<li class=\"blockList\">\n"
                 + "<h4>delta</h4>\n"
                 + "<pre>public final&nbsp;java.util.List&lt;"
                 + "java.util.Set&lt;? super java.lang.Object&gt;&gt; deltaProperty</pre>\n"
                 + "</li>\n"
                 + "</ul>\n"
-                + "<a name=\"gammaProperty\">\n"
-                + "<!--   -->\n"
-                + "</a>\n"
-                + "<ul class=\"blockListLast\">\n"
-                + "<li class=\"blockList\">\n"
-                + "<h4>gamma</h4>\n"
-                + "<pre>public final&nbsp;java.util.List&lt;"
-                + "java.lang.String&gt; gammaProperty</pre>\n"
                 + "</li>\n"
-                + "</ul>\n"
-                + "</li>");
+                + "</ul>");
     }
 
     /*
--- a/langtools/test/jdk/javadoc/doclet/testOrdering/TestOrdering.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/TestOrdering.java	Tue Nov 22 11:45:55 2016 -0800
@@ -23,9 +23,8 @@
 
 /*
  * @test
- * @bug 8039410 8042601 8042829 8049393 8050031 8155061 8155995
+ * @bug 8039410 8042601 8042829 8049393 8050031 8155061 8155995 8167967
  * @summary test to determine if members are ordered correctly
- * @author ksrini
  * @library ../lib/
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
  * @build JavadocTester
@@ -51,492 +50,640 @@
 
     @Test
     void testUnnamedPackagesForClassUse() {
-        javadoc("-d", "out",
-                "-sourcepath", testSrc,
-                "-use",
-                testSrc("C.java"), testSrc("UsedInC.java"));
-        checkExit(Exit.OK);
-        checkExecutableMemberOrdering("class-use/UsedInC.html");
+        new UnnamedPackageForClassUseTest(this).run();
     }
 
     @Test
     void testNamedPackagesForClassUse() {
-        javadoc("-d", "out-1",
-                "-sourcepath", testSrc,
-                "-use",
-                "pkg1");
-        checkExit(Exit.OK);
-        checkClassUseOrdering("pkg1/class-use/UsedClass.html");
-        checkOrder("pkg1/class-use/UsedClass.html", expectedClassUseMethodOrdering);
-        checkOrder("pkg1/class-use/UsedClass.html", expectedClassUseWithTypeParams);
-        checkOrder("pkg1/class-use/UsedClass.html", expectedInnerClassContructors);
-        checkOrder("pkg1/ImplementsOrdering.html", expectedImplementsOrdering);
-        checkOrder("pkg1/OverrideOrdering.html", expectedOverrideOrdering);
-        checkOrder("allclasses-noframe.html", expectedAllClasses);
-        checkOrder("allclasses-frame.html", expectedAllClasses);
+        new NamedPackagesForClassUseTest(this).run();
     }
 
-    enum ListOrder { NONE, REVERSE, SHUFFLE };
-    /*
-     * By default we do not shuffle the input list, in order to keep the list deterministic,
-     * and the test predictable. However, we can turn on the stress mode, by setting the following
-     * property if required.
-     */
-    static final ListOrder STRESS_MODE = Boolean.getBoolean("TestOrder.STRESS")
-            ? ListOrder.SHUFFLE
-            : ListOrder.REVERSE;
-
-    /*
-     * Controls the number of sibling packages,  pkg0, pkg1, pkg2, .....
-     */
-    static final int MAX_PACKAGES = 4;
-
-    /*
-     * Controls the number of children packages, pkg0, pkg0.pkg, pkg0.pkg.pkg, .....
-     * Note: having too long a depth (> 256 chars on Windows), will likely lead to
-     * cause problems with automated build and test systems.
-     */
-    static final int MAX_SUBPACKAGES_DEPTH = 4;
     @Test
     void testIndexOrdering() throws IOException {
-        final String clsname = "Add";
-        List<String> cmdArgs = new ArrayList();
-        cmdArgs.add("-d");
-        cmdArgs.add("out-2");
-        cmdArgs.add("-sourcepath");
-        cmdArgs.add("src");
-        cmdArgs.add("-package");
-        System.out.println("STRESS_MODE: " + STRESS_MODE);
-        emitFile(null, clsname, STRESS_MODE);
-        for (int width = 0 ; width < MAX_PACKAGES ; width++) {
-            String wpkgname = "add" + width;
-            String dpkgname = wpkgname;
-            emitFile(wpkgname, clsname, ListOrder.NONE); // list as-is
-            cmdArgs.add(wpkgname);
-            for (int depth = 1 ; depth < MAX_SUBPACKAGES_DEPTH ; depth++) {
-                dpkgname = dpkgname + ".add";
-                emitFile(dpkgname, clsname, STRESS_MODE);
-                cmdArgs.add(dpkgname);
-            }
-        }
-        File srcDir = new File(new File("."), "src");
-        cmdArgs.add(new File(srcDir, clsname + ".java").getPath());
-        javadoc(cmdArgs.toArray(new String[cmdArgs.size()]));
-        checkExit(Exit.OK);
-        checkOrder("index-all.html", composeTestVectors());
-        checkOrder("add0/add/package-tree.html", expectedPackageTreeOrdering);
-        checkOrder("overview-tree.html", expectedOverviewOrdering);
-        checkOrder("overview-frame.html", expectedOverviewFrameOrdering);
+        new IndexOrderingTest(this).run();
     }
 
     @Test
     void testIndexTypeClustering() {
-        javadoc("-d", "out-3",
-                "-sourcepath", testSrc("src-2"),
-                "-use",
-                "a",
-                "b",
-                "e",
-                "something");
-        checkOrder("index-all.html", typeTestVectors);
-        checkExit(Exit.OK);
+        new IndexTypeClusteringTest(this).run();
     }
 
     @Test
-    void testMethodDetailOrdering() {
-        javadoc("-d", "out-4",
-                "-sourcepath", testSrc(new File(".").getPath()),
-                "order"
-        );
-        checkOrder("order/MethodOrder.html", methodSourceOrderVectors);
-        checkExit(Exit.OK);
+    void testTypeElementMemberOrdering() {
+        new TypeElementMemberOrderingTest(this).run();
     }
 
-    String[] methodSourceOrderVectors = {
-        "<pre>public&nbsp;void&nbsp;d()</pre>\n" +
-        "<div class=\"block\">Method d.\n" +
-        " Second line.</div>",
-        "<pre>public&nbsp;void&nbsp;b()</pre>\n" +
-        "<div class=\"block\">Method b.\n" +
-        " Second line.</div>",
-        "<pre>public&nbsp;void&nbsp;c()</pre>\n" +
-        "<div class=\"block\">Method c.\n" +
-        " Second line.</div>",
-        "<pre>public&nbsp;void&nbsp;a()</pre>\n" +
-        "<div class=\"block\">Method a.\n" +
-        " Second line.</div>"
-    };
+    static class UnnamedPackageForClassUseTest {
+        final JavadocTester tester;
+
+        UnnamedPackageForClassUseTest(JavadocTester tester) {
+            this.tester = tester;
+        }
+
+        void run() {
+            tester.javadoc("-d", "out",
+                    "-sourcepath", testSrc,
+                    "-use",
+                    tester.testSrc("C.java"), tester.testSrc("UsedInC.java"));
+            tester.checkExit(Exit.OK);
+            checkExecutableMemberOrdering("class-use/UsedInC.html");
+        }
 
-    String[] typeTestVectors = {
-        "something</a> - package something</dt>",
-        "something</span></a> - Class in",
-        "something</span></a> - Enum in",
-        "something</span></a> - Interface in",
-        "something</span></a> - Annotation Type in",
-        "something</a></span> - Variable in class",
-        "something()</a></span> - Constructor",
-        "something()</a></span> - Method in class a.<a href=\"a/A.html\"",
-        "something()</a></span> - Method in class a.<a href=\"a/something.html\"",
-        "something()</a></span> - Method in class something.<a href=\"something/J.html\""
-    };
+        void checkExecutableMemberOrdering(String usePage) {
+            String contents = tester.readFile(usePage);
+            // check constructors
+            tester.checking("constructors");
+            int idx1 = contents.indexOf("C.html#C-UsedInC");
+            int idx2 = contents.indexOf("C.html#C-UsedInC-int");
+            int idx3 = contents.indexOf("C.html#C-UsedInC-java.lang.String");
+            if (idx1 == -1 || idx2 == -1 || idx3 == -1) {
+                tester.failed("ctor strings not found");
+            } else if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) {
+                tester.failed("ctor strings are out of order");
+            } else {
+                tester.passed("ctor strings are in order");
+            }
 
-    String[] composeTestVectors() {
-        List<String> testList = new ArrayList<>();
+            // check methods
+            tester.checking("methods");
+            idx1 = contents.indexOf("C.html#ymethod-int");
+            idx2 = contents.indexOf("C.html#ymethod-java.lang.String");
+            if (idx1 == -1 || idx2 == -1) {
+                tester.failed("#ymethod strings not found");
+            } else if (idx1 > idx2) {
+                tester.failed("#ymethod strings are out of order");
+            } else {
+                tester.passed("Executable Member Ordering: OK");
+            }
+        }
+    }
 
-        testList.addAll(Arrays.asList(expectedPackageOrdering));
-        for (String x : expectedEnumOrdering) {
-            testList.add(x.replace("REPLACE_ME", "&lt;Unnamed&gt;"));
-            for (int i = 0; i < MAX_PACKAGES; i++) {
-                String wpkg = "add" + i;
-                testList.add(wpkg + "/" + x.replace("REPLACE_ME",
-                        wpkg));
-                String dpkg = wpkg;
-                for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
-                    dpkg = dpkg + "/" + "add";
-                    testList.add(dpkg + "/" + x.replace("REPLACE_ME",
-                            pathToPackage(dpkg)));
-                }
-            }
+    static class NamedPackagesForClassUseTest {
+        final JavadocTester tester;
+
+        NamedPackagesForClassUseTest(JavadocTester tester) {
+            this.tester = tester;
         }
 
-        testList.addAll(Arrays.asList(expectedFieldOrdering));
+        public void run() {
+            tester.javadoc("-d", "out-1",
+                    "-sourcepath", tester.testSrc,
+                    "-use",
+                    "pkg1");
+            tester.checkExit(Exit.OK);
+
+            checkClassUseOrdering("pkg1/class-use/UsedClass.html");
+
+            tester.checkOrder("pkg1/class-use/UsedClass.html",
+                    "../../pkg1/MethodOrder.html#m--",
+                    "../../pkg1/MethodOrder.html#m-byte:A-",
+                    "../../pkg1/MethodOrder.html#m-double-",
+                    "../../pkg1/MethodOrder.html#m-double-double-",
+                    "../../pkg1/MethodOrder.html#m-double-java.lang.Double-",
+                    "../../pkg1/MethodOrder.html#m-int-",
+                    "../../pkg1/MethodOrder.html#m-int-int-",
+                    "../../pkg1/MethodOrder.html#m-int-java.lang.Integer-",
+                    "../../pkg1/MethodOrder.html#m-long-",
+                    "../../pkg1/MethodOrder.html#m-long-long-",
+                    "../../pkg1/MethodOrder.html#m-long-java.lang.Long-",
+                    "../../pkg1/MethodOrder.html#m-long-java.lang.Long...-",
+                    "../../pkg1/MethodOrder.html#m-java.lang.Double-",
+                    "../../pkg1/MethodOrder.html#m-java.lang.Double-double-",
+                    "../../pkg1/MethodOrder.html#m-java.lang.Double-java.lang.Double-",
+                    "../../pkg1/MethodOrder.html#m-java.lang.Integer-",
+                    "../../pkg1/MethodOrder.html#m-java.lang.Integer-int-",
+                    "../../pkg1/MethodOrder.html#m-java.lang.Integer-java.lang.Integer-",
+                    "../../pkg1/MethodOrder.html#m-java.lang.Object:A-",
+                    "../../pkg1/MethodOrder.html#m-java.util.ArrayList-",
+                    "../../pkg1/MethodOrder.html#m-java.util.Collection-",
+                    "../../pkg1/MethodOrder.html#m-java.util.List-");
+
+            tester.checkOrder("pkg1/class-use/UsedClass.html",
+                    "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-",
+                    "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass-",
+                    "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass:A-",
+                    "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-java.lang.String-");
 
-        for (String x : expectedMethodOrdering) {
-            testList.add(x);
-            for (int i = 0; i < MAX_PACKAGES; i++) {
-                String wpkg = "add" + i;
-                testList.add(wpkg + "/" + x);
-                String dpkg = wpkg;
-                for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
-                    dpkg = dpkg + "/" + "add";
-                    testList.add(dpkg + "/" + x);
-                }
-            }
+            tester.checkOrder("pkg1/class-use/UsedClass.html",
+                    "../../pkg1/A.html#A-pkg1.UsedClass-",
+                    "../../pkg1/B.A.html#A-pkg1.UsedClass-",
+                    "../../pkg1/B.html#B-pkg1.UsedClass-",
+                    "../../pkg1/A.C.html#C-pkg1.UsedClass-java.lang.Object:A-",
+                    "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.Collection-",
+                    "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.List-");
+
+            tester.checkOrder("pkg1/ImplementsOrdering.html",
+                    "<dd><code>close</code>&nbsp;in interface&nbsp;<code>java.lang.AutoCloseable</code></dd>",
+                    "<dd><code>close</code>&nbsp;in interface&nbsp;<code>java.nio.channels.Channel</code></dd>",
+                    "<dd><code>close</code>&nbsp;in interface&nbsp;<code>java.io.Closeable</code></dd>");
+
+            tester.checkOrder("pkg1/OverrideOrdering.html",
+                    "<dd><code>iterator</code>&nbsp;in interface&nbsp;<code>java.util.Collection&lt;",
+                    "<dd><code>iterator</code>&nbsp;in interface&nbsp;<code>java.lang.Iterable&lt;");
+
+            tester.checkOrder("allclasses-noframe.html",
+                    "pkg1/A.html\" title=\"class in pkg1",
+                    "pkg1/A.C.html\" title=\"class in pkg1",
+                    "pkg1/B.html\" title=\"class in pkg1",
+                    "pkg1/B.A.html\" title=\"class in pkg1",
+                    "pkg1/C1.html\" title=\"class in pkg1",
+                    "pkg1/C2.html\" title=\"class in pkg1",
+                    "pkg1/C3.html\" title=\"class in pkg1",
+                    "pkg1/C4.html\" title=\"class in pkg1",
+                    "pkg1/ImplementsOrdering.html\" title=\"interface in pkg1",
+                    "pkg1/MethodOrder.html\" title=\"class in pkg1",
+                    "pkg1/OverrideOrdering.html\" title=\"class in pkg1",
+                    "pkg1/UsedClass.html\" title=\"class in pkg1");
+
+            tester.checkOrder("allclasses-frame.html",
+                    "pkg1/A.html\" title=\"class in pkg1",
+                    "pkg1/A.C.html\" title=\"class in pkg1",
+                    "pkg1/B.html\" title=\"class in pkg1",
+                    "pkg1/B.A.html\" title=\"class in pkg1",
+                    "pkg1/C1.html\" title=\"class in pkg1",
+                    "pkg1/C2.html\" title=\"class in pkg1",
+                    "pkg1/C3.html\" title=\"class in pkg1",
+                    "pkg1/C4.html\" title=\"class in pkg1",
+                    "pkg1/ImplementsOrdering.html\" title=\"interface in pkg1",
+                    "pkg1/MethodOrder.html\" title=\"class in pkg1",
+                    "pkg1/OverrideOrdering.html\" title=\"class in pkg1",
+                    "pkg1/UsedClass.html\" title=\"class in pkg1");
         }
 
-        return testList.toArray(new String[testList.size()]);
-    }
-
-    void checkExecutableMemberOrdering(String usePage) {
-        String contents = readFile(usePage);
-        // check constructors
-        checking("constructors");
-        int idx1 = contents.indexOf("C.html#C-UsedInC");
-        int idx2 = contents.indexOf("C.html#C-UsedInC-int");
-        int idx3 = contents.indexOf("C.html#C-UsedInC-java.lang.String");
-        if (idx1 == -1 || idx2 == -1 || idx3 == -1) {
-            failed("ctor strings not found");
-        } else if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) {
-            failed("ctor strings are out of order");
-        } else
-            passed("ctor strings are in order");
+        void checkClassUseOrdering(String usePage) {
+            checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zfield");
+            checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#fieldInC#ITERATION#");
+            checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zmethod-pkg1.UsedClass");
+            checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#methodInC#ITERATION#");
+        }
 
-        // check methods
-        checking("methods");
-        idx1 = contents.indexOf("C.html#ymethod-int");
-        idx2 = contents.indexOf("C.html#ymethod-java.lang.String");
-        if (idx1 == -1 || idx2 == -1) {
-            failed("#ymethod strings not found");
-        } else if (idx1 > idx2) {
-            failed("#ymethod strings are out of order");
-        } else
-            passed("Executable Member Ordering: OK");
-    }
-
-    void checkClassUseOrdering(String usePage) {
-        checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zfield");
-        checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#fieldInC#ITERATION#");
-        checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zmethod-pkg1.UsedClass");
-        checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#methodInC#ITERATION#");
-    }
-
-    void checkClassUseOrdering(String usePage, String searchString) {
-        String contents = readFile(usePage);
-        int lastidx = 0;
-        System.out.println("testing for " + searchString);
-        for (int i = 1; i < 5; i++) {
-            String s = searchString.replaceAll("#ITERATION#", Integer.toString(i));
-            checking(s);
-            int idx = contents.indexOf(s);
-            if (idx < lastidx) {
-                failed(s + ", member ordering error, last:" + lastidx + ", got:" + idx);
-            } else {
-                passed("\tlast: " + lastidx + " got:" + idx);
+        void checkClassUseOrdering(String usePage, String searchString) {
+            String contents = tester.readFile(usePage);
+            int lastidx = 0;
+            System.out.println("testing for " + searchString);
+            for (int i = 1; i < 5; i++) {
+                String s = searchString.replaceAll("#ITERATION#", Integer.toString(i));
+                tester.checking(s);
+                int idx = contents.indexOf(s);
+                if (idx < lastidx) {
+                    tester.failed(s + ", member ordering error, last:" + lastidx + ", got:" + idx);
+                } else {
+                    tester.passed("\tlast: " + lastidx + " got:" + idx);
+                }
+                lastidx = idx;
             }
-            lastidx = idx;
         }
     }
 
-    static String[] contents = {
-        "public add ADDADD;",
-        "public add AddAdd;",
-        "public add addadd;",
-        "public enum add {add, ADD, addd, ADDD};",
-        "public enum ADD {ADD, add, addd, ADDD};",
-        "public void   add(){}",
-        "public void   add(double d){}",
-        "public void   add(int i, float f){}",
-        "public void   add(float f, int i){}",
-        "public void   add(double d, byte b){}",
-        "public Double add(Double d) {return (double) 22/7;}",
-        "public double add(double d1, double d2) {return d1 + d2;}",
-        "public double add(double d1, Double  d2) {return d1 + d2;}",
-        "public Float  add(float f) {return (float) 22/7;}",
-        "public void   add(int i){}",
-        "public int    add(Integer i) {return 0;}"
-    };
+    static class IndexOrderingTest {
+        private final JavadocTester tester;
+
+        IndexOrderingTest(JavadocTester tester) {
+            this.tester = tester;
+        }
+
+        enum ListOrder {
+            NONE, REVERSE, SHUFFLE
+        };
+
+        /*
+         * By default we do not shuffle the input list, in order to keep the list deterministic,
+         * and the test predictable. However, we can turn on the stress mode, by setting the following
+         * property if required.
+         */
+        static final ListOrder STRESS_MODE = Boolean.getBoolean("TestOrder.STRESS")
+                ? ListOrder.SHUFFLE
+                : ListOrder.REVERSE;
+
+        /*
+         * Controls the number of children packages, pkg0, pkg0.pkg, pkg0.pkg.pkg, .....
+         * Note: having too long a depth (> 256 chars on Windows), will likely lead to
+         * cause problems with automated build and test systems.
+         */
+        static final int MAX_SUBPACKAGES_DEPTH = 4;
+
+        /*
+         * Controls the number of sibling packages,  pkg0, pkg1, pkg2, .....
+         */
+        static final int MAX_PACKAGES = 4;
+
+        static String[] contents = {
+            "public add ADDADD;",
+            "public add AddAdd;",
+            "public add addadd;",
+            "public enum add {add, ADD, addd, ADDD};",
+            "public enum ADD {ADD, add, addd, ADDD};",
+            "public void   add(){}",
+            "public void   add(double d){}",
+            "public void   add(int i, float f){}",
+            "public void   add(float f, int i){}",
+            "public void   add(double d, byte b){}",
+            "public Double add(Double d) {return (double) 22/7;}",
+            "public double add(double d1, double d2) {return d1 + d2;}",
+            "public double add(double d1, Double  d2) {return d1 + d2;}",
+            "public Float  add(float f) {return (float) 22/7;}",
+            "public void   add(int i){}",
+            "public int    add(Integer i) {return 0;}"
+        };
+
+        static String expectedEnumOrdering[] = {
+            "Add.add.html\" title=\"enum in REPLACE_ME\"",
+            "Add.ADD.html\" title=\"enum in REPLACE_ME\""
+        };
+
+        static String expectedFieldOrdering[] = {
+            "Add.html#addadd\"",
+            "add0/add/add/add/Add.html#addadd\"",
+            "add0/add/add/Add.html#addadd\"",
+            "add0/add/Add.html#addadd\"",
+            "add0/Add.html#addadd\"",
+            "add1/add/add/add/Add.html#addadd\"",
+            "add1/add/add/Add.html#addadd\"",
+            "add1/add/Add.html#addadd\"",
+            "add1/Add.html#addadd\"",
+            "add2/add/add/add/Add.html#addadd\"",
+            "add2/add/add/Add.html#addadd\"",
+            "add2/add/Add.html#addadd\"",
+            "add2/Add.html#addadd\"",
+            "add3/add/add/add/Add.html#addadd\"",
+            "add3/add/add/Add.html#addadd\"",
+            "add3/add/Add.html#addadd\"",
+            "add3/Add.html#addadd\"",
+            "Add.html#AddAdd\"",
+            "add0/add/add/add/Add.html#AddAdd\"",
+            "add0/add/add/Add.html#AddAdd\"",
+            "add0/add/Add.html#AddAdd\"",
+            "add0/Add.html#AddAdd\"",
+            "add1/add/add/add/Add.html#AddAdd\"",
+            "add1/add/add/Add.html#AddAdd\"",
+            "add1/add/Add.html#AddAdd\"",
+            "add1/Add.html#AddAdd\"",
+            "add2/add/add/add/Add.html#AddAdd\"",
+            "add2/add/add/Add.html#AddAdd\"",
+            "add2/add/Add.html#AddAdd\"",
+            "add2/Add.html#AddAdd\"",
+            "add3/add/add/add/Add.html#AddAdd\"",
+            "add3/add/add/Add.html#AddAdd\"",
+            "add3/add/Add.html#AddAdd\"",
+            "add3/Add.html#AddAdd\"",
+            "Add.html#ADDADD\"",
+            "add0/add/add/add/Add.html#ADDADD\"",
+            "add0/add/add/Add.html#ADDADD\"",
+            "add0/add/Add.html#ADDADD\"",
+            "add0/Add.html#ADDADD\"",
+            "add1/add/add/add/Add.html#ADDADD\"",
+            "add1/add/add/Add.html#ADDADD\"",
+            "add1/add/Add.html#ADDADD\"",
+            "add1/Add.html#ADDADD\"",
+            "add2/add/add/add/Add.html#ADDADD\"",
+            "add2/add/add/Add.html#ADDADD\"",
+            "add2/add/Add.html#ADDADD\"",
+            "add2/Add.html#ADDADD\"",
+            "add3/add/add/add/Add.html#ADDADD\"",
+            "add3/add/add/Add.html#ADDADD\"",
+            "add3/add/Add.html#ADDADD\"",
+            "add3/Add.html#ADDADD\""
+        };
+
+        static String expectedMethodOrdering[] = {
+            "Add.html#add--",
+            "Add.html#add-double-",
+            "Add.html#add-double-byte-",
+            "Add.html#add-double-double-",
+            "Add.html#add-double-java.lang.Double-",
+            "Add.html#add-float-",
+            "Add.html#add-float-int-",
+            "Add.html#add-int-",
+            "Add.html#add-int-float-",
+            "Add.html#add-java.lang.Double-",
+            "Add.html#add-java.lang.Integer-"
+        };
+
+        static String expectedPackageOrdering[] = {
+            "\"add0/package-summary.html\">add0</a> - package add0",
+            "\"add0/add/package-summary.html\">add0.add</a> - package add0.add",
+            "\"add0/add/add/package-summary.html\">add0.add.add</a> - package add0.add.add",
+            "\"add0/add/add/add/package-summary.html\">add0.add.add.add</a> - package add0.add.add.add",
+            "\"add1/package-summary.html\">add1</a> - package add1",
+            "\"add1/add/package-summary.html\">add1.add</a> - package add1.add",
+            "\"add1/add/add/package-summary.html\">add1.add.add</a> - package add1.add.add",
+            "\"add1/add/add/add/package-summary.html\">add1.add.add.add</a> - package add1.add.add.add",
+            "\"add2/package-summary.html\">add2</a> - package add2",
+            "\"add2/add/package-summary.html\">add2.add</a> - package add2.add",
+            "\"add2/add/add/package-summary.html\">add2.add.add</a> - package add2.add.add",
+            "\"add2/add/add/add/package-summary.html\">add2.add.add.add</a> - package add2.add.add.add",
+            "\"add3/package-summary.html\">add3</a> - package add3",
+            "\"add3/add/package-summary.html\">add3.add</a> - package add3.add",
+            "\"add3/add/add/package-summary.html\">add3.add.add</a> - package add3.add.add",
+            "\"add3/add/add/add/package-summary.html\">add3.add.add.add</a> - package add3.add.add.add"
+        };
 
-    void emitFile(String pkgname, String clsname, ListOrder order) throws IOException {
-        File srcDir = new File("src");
-        File outDir = pkgname == null
-            ? srcDir
-            : new File(srcDir, pkgname.replace(".", File.separator));
-        File outFile = new File(outDir, clsname + ".java");
-        outDir.mkdirs();
-        List<String> scratch = new ArrayList<>(Arrays.asList(contents));
-        switch (order) {
-            case SHUFFLE:
-                Collections.shuffle(scratch);
-                break;
-            case REVERSE:
-                Collections.reverse(scratch);
-                break;
-            default:
+        void run() throws IOException {
+            final String clsname = "Add";
+            List<String> cmdArgs = new ArrayList();
+            cmdArgs.add("-d");
+            cmdArgs.add("out-2");
+            cmdArgs.add("-sourcepath");
+            cmdArgs.add("src");
+            cmdArgs.add("-package");
+            System.out.println("STRESS_MODE: " + STRESS_MODE);
+            emitFile(null, clsname, STRESS_MODE);
+            for (int width = 0; width < MAX_PACKAGES; width++) {
+                String wpkgname = "add" + width;
+                String dpkgname = wpkgname;
+                emitFile(wpkgname, clsname, ListOrder.NONE); // list as-is
+                cmdArgs.add(wpkgname);
+                for (int depth = 1; depth < MAX_SUBPACKAGES_DEPTH; depth++) {
+                    dpkgname = dpkgname + ".add";
+                    emitFile(dpkgname, clsname, STRESS_MODE);
+                    cmdArgs.add(dpkgname);
+                }
+            }
+            File srcDir = new File(new File("."), "src");
+            cmdArgs.add(new File(srcDir, clsname + ".java").getPath());
+            tester.javadoc(cmdArgs.toArray(new String[cmdArgs.size()]));
+            tester.checkExit(Exit.OK);
+            tester.checkOrder("index-all.html", composeTestVectors());
+            tester.checkOrder("add0/add/package-tree.html",
+                    "<a href=\"../../add0/add/Add.add.html\" title=\"enum in add0.add\">",
+                    "<a href=\"../../add0/add/Add.ADD.html\" title=\"enum in add0.add\">");
+            tester.checkOrder("overview-tree.html",
+                    "<a href=\"Add.add.html\" title=\"enum in &lt;Unnamed&gt;\">",
+                    "<a href=\"add0/Add.add.html\" title=\"enum in add0\">",
+                    "<a href=\"add0/add/Add.add.html\" title=\"enum in add0.add\">",
+                    "<a href=\"add0/add/add/Add.add.html\" title=\"enum in add0.add.add\">",
+                    "<a href=\"add0/add/add/add/Add.add.html\" title=\"enum in add0.add.add.add\">",
+                    "<a href=\"add1/Add.add.html\" title=\"enum in add1\">",
+                    "<a href=\"add1/add/Add.add.html\" title=\"enum in add1.add\">",
+                    "<a href=\"add1/add/add/Add.add.html\" title=\"enum in add1.add.add\">",
+                    "<a href=\"add1/add/add/add/Add.add.html\" title=\"enum in add1.add.add.add\">",
+                    "<a href=\"add2/Add.add.html\" title=\"enum in add2\">",
+                    "<a href=\"add2/add/Add.add.html\" title=\"enum in add2.add\">",
+                    "<a href=\"add2/add/add/Add.add.html\" title=\"enum in add2.add.add\">",
+                    "<a href=\"add2/add/add/add/Add.add.html\" title=\"enum in add2.add.add.add\">",
+                    "<a href=\"add3/Add.add.html\" title=\"enum in add3\">",
+                    "<a href=\"add3/add/Add.add.html\" title=\"enum in add3.add\">",
+                    "<a href=\"add3/add/add/Add.add.html\" title=\"enum in add3.add.add\">",
+                    "<a href=\"add3/add/add/add/Add.add.html\" title=\"enum in add3.add.add.add\">",
+                    "<a href=\"Add.ADD.html\" title=\"enum in &lt;Unnamed&gt;\">",
+                    "<a href=\"add0/Add.ADD.html\" title=\"enum in add0\">",
+                    "<a href=\"add0/add/Add.ADD.html\" title=\"enum in add0.add\">",
+                    "<a href=\"add0/add/add/Add.ADD.html\" title=\"enum in add0.add.add\">",
+                    "<a href=\"add0/add/add/add/Add.ADD.html\" title=\"enum in add0.add.add.add\">",
+                    "<a href=\"add1/Add.ADD.html\" title=\"enum in add1\">",
+                    "<a href=\"add1/add/Add.ADD.html\" title=\"enum in add1.add\">",
+                    "<a href=\"add1/add/add/Add.ADD.html\" title=\"enum in add1.add.add\">",
+                    "<a href=\"add1/add/add/add/Add.ADD.html\" title=\"enum in add1.add.add.add\">",
+                    "<a href=\"add2/Add.ADD.html\" title=\"enum in add2\">",
+                    "<a href=\"add2/add/Add.ADD.html\" title=\"enum in add2.add\">",
+                    "<a href=\"add2/add/add/Add.ADD.html\" title=\"enum in add2.add.add\">",
+                    "<a href=\"add2/add/add/add/Add.ADD.html\" title=\"enum in add2.add.add.add\">",
+                    "<a href=\"add3/Add.ADD.html\" title=\"enum in add3\">",
+                    "<a href=\"add3/add/Add.ADD.html\" title=\"enum in add3.add\">",
+                    "<a href=\"add3/add/add/Add.ADD.html\" title=\"enum in add3.add.add\">",
+                    "<a href=\"add3/add/add/add/Add.ADD.html\" title=\"enum in add3.add.add.add\">");
+
+            tester.checkOrder("overview-frame.html",
+                    "<a href=\"package-frame.html\" target=\"packageFrame\">&lt;unnamed package&gt;</a>",
+                    "<a href=\"add0/package-frame.html\" target=\"packageFrame\">add0</a>",
+                    "<a href=\"add0/add/package-frame.html\" target=\"packageFrame\">add0.add</a>",
+                    "<a href=\"add0/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add</a>",
+                    "<a href=\"add0/add/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add.add</a>",
+                    "<a href=\"add1/package-frame.html\" target=\"packageFrame\">add1</a>",
+                    "<a href=\"add1/add/package-frame.html\" target=\"packageFrame\">add1.add</a>",
+                    "<a href=\"add1/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add</a>",
+                    "<a href=\"add1/add/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add.add</a>",
+                    "<a href=\"add2/package-frame.html\" target=\"packageFrame\">add2</a>",
+                    "<a href=\"add2/add/package-frame.html\" target=\"packageFrame\">add2.add</a>",
+                    "<a href=\"add2/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add</a>",
+                    "<a href=\"add2/add/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add.add</a>",
+                    "<a href=\"add3/package-frame.html\" target=\"packageFrame\">add3</a>",
+                    "<a href=\"add3/add/package-frame.html\" target=\"packageFrame\">add3.add</a>",
+                    "<a href=\"add3/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add</a>",
+                    "<a href=\"add3/add/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add.add</a></li>");
+        }
+
+        void emitFile(String pkgname, String clsname, ListOrder order) throws IOException {
+            File srcDir = new File("src");
+            File outDir = pkgname == null
+                    ? srcDir
+                    : new File(srcDir, pkgname.replace(".", File.separator));
+            File outFile = new File(outDir, clsname + ".java");
+            outDir.mkdirs();
+            List<String> scratch = new ArrayList<>(Arrays.asList(contents));
+            switch (order) {
+                case SHUFFLE:
+                    Collections.shuffle(scratch);
+                    break;
+                case REVERSE:
+                    Collections.reverse(scratch);
+                    break;
+                default:
                 // leave list as-is
-        }
-        // insert the header
-        scratch.add(0, "public class " + clsname + " {");
-        if (pkgname != null) {
-            scratch.add(0, "package " + pkgname + ";");
+            }
+            // insert the header
+            scratch.add(0, "public class " + clsname + " {");
+            if (pkgname != null) {
+                scratch.add(0, "package " + pkgname + ";");
+            }
+            // append the footer
+            scratch.add("}");
+            Files.write(outFile.toPath(), scratch, CREATE, TRUNCATE_EXISTING);
         }
-        // append the footer
-        scratch.add("}");
-        Files.write(outFile.toPath(), scratch, CREATE, TRUNCATE_EXISTING);
-    }
+
+        String[] composeTestVectors() {
+            List<String> testList = new ArrayList<>();
+
+            testList.addAll(Arrays.asList(expectedPackageOrdering));
+            for (String x : expectedEnumOrdering) {
+                testList.add(x.replace("REPLACE_ME", "&lt;Unnamed&gt;"));
+                for (int i = 0; i < MAX_PACKAGES; i++) {
+                    String wpkg = "add" + i;
+                    testList.add(wpkg + "/" + x.replace("REPLACE_ME",
+                            wpkg));
+                    String dpkg = wpkg;
+                    for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
+                        dpkg = dpkg + "/" + "add";
+                        testList.add(dpkg + "/" + x.replace("REPLACE_ME", pathToPackage(dpkg)));
+                    }
+                }
+            }
 
-    String pathToPackage(String in) {
-        return in.replace("/", ".");
+            testList.addAll(Arrays.asList(expectedFieldOrdering));
+
+            for (String x : expectedMethodOrdering) {
+                testList.add(x);
+                for (int i = 0; i < MAX_PACKAGES; i++) {
+                    String wpkg = "add" + i;
+                    testList.add(wpkg + "/" + x);
+                    String dpkg = wpkg;
+                    for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) {
+                        dpkg = dpkg + "/" + "add";
+                        testList.add(dpkg + "/" + x);
+                    }
+                }
+            }
+
+            return testList.toArray(new String[testList.size()]);
+        }
+
+        String pathToPackage(String in) {
+            return in.replace("/", ".");
+        }
     }
 
-    final String expectedAllClasses[] = {
-        "pkg1/A.html\" title=\"class in pkg1",
-        "pkg1/A.C.html\" title=\"class in pkg1",
-        "pkg1/B.html\" title=\"class in pkg1",
-        "pkg1/B.A.html\" title=\"class in pkg1",
-        "pkg1/C1.html\" title=\"class in pkg1",
-        "pkg1/C2.html\" title=\"class in pkg1",
-        "pkg1/C3.html\" title=\"class in pkg1",
-        "pkg1/C4.html\" title=\"class in pkg1",
-        "pkg1/ImplementsOrdering.html\" title=\"interface in pkg1",
-        "pkg1/MethodOrder.html\" title=\"class in pkg1",
-        "pkg1/OverrideOrdering.html\" title=\"class in pkg1",
-        "pkg1/UsedClass.html\" title=\"class in pkg1"
+    static class IndexTypeClusteringTest {
+
+        private final JavadocTester tester;
+
+        IndexTypeClusteringTest(JavadocTester tester) {
+            this.tester = tester;
+        }
 
-    };
+        void run() {
+            tester.javadoc("-d", "out-3",
+                    "-sourcepath", tester.testSrc("src-2"),
+                    "-use",
+                    "a",
+                    "b",
+                    "e",
+                    "something");
+
+            tester.checkExit(Exit.OK);
 
-    final String expectedInnerClassContructors[] = {
-        "../../pkg1/A.html#A-pkg1.UsedClass-",
-        "../../pkg1/B.A.html#A-pkg1.UsedClass-",
-        "../../pkg1/B.html#B-pkg1.UsedClass-",
-        "../../pkg1/A.C.html#C-pkg1.UsedClass-java.lang.Object:A-",
-        "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.Collection-",
-        "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.List-"
-    };
+            tester.checkOrder("index-all.html",
+                    "something</a> - package something</dt>",
+                    "something</span></a> - Class in",
+                    "something</span></a> - Enum in",
+                    "something</span></a> - Interface in",
+                    "something</span></a> - Annotation Type in",
+                    "something</a></span> - Variable in class",
+                    "something()</a></span> - Constructor",
+                    "something()</a></span> - Method in class a.<a href=\"a/A.html\"",
+                    "something()</a></span> - Method in class a.<a href=\"a/something.html\"",
+                    "something()</a></span> - Method in class something.<a href=\"something/J.html\"");
+        }
+    }
 
-    final String expectedClassUseMethodOrdering[] = {
-        "../../pkg1/MethodOrder.html#m--",
-        "../../pkg1/MethodOrder.html#m-byte:A-",
-        "../../pkg1/MethodOrder.html#m-double-",
-        "../../pkg1/MethodOrder.html#m-double-double-",
-        "../../pkg1/MethodOrder.html#m-double-java.lang.Double-",
-        "../../pkg1/MethodOrder.html#m-int-",
-        "../../pkg1/MethodOrder.html#m-int-int-",
-        "../../pkg1/MethodOrder.html#m-int-java.lang.Integer-",
-        "../../pkg1/MethodOrder.html#m-long-",
-        "../../pkg1/MethodOrder.html#m-long-long-",
-        "../../pkg1/MethodOrder.html#m-long-java.lang.Long-",
-        "../../pkg1/MethodOrder.html#m-long-java.lang.Long...-",
-        "../../pkg1/MethodOrder.html#m-java.lang.Double-",
-        "../../pkg1/MethodOrder.html#m-java.lang.Double-double-",
-        "../../pkg1/MethodOrder.html#m-java.lang.Double-java.lang.Double-",
-        "../../pkg1/MethodOrder.html#m-java.lang.Integer-",
-        "../../pkg1/MethodOrder.html#m-java.lang.Integer-int-",
-        "../../pkg1/MethodOrder.html#m-java.lang.Integer-java.lang.Integer-",
-        "../../pkg1/MethodOrder.html#m-java.lang.Object:A-",
-        "../../pkg1/MethodOrder.html#m-java.util.ArrayList-",
-        "../../pkg1/MethodOrder.html#m-java.util.Collection-",
-        "../../pkg1/MethodOrder.html#m-java.util.List-"
-    };
+    static class TypeElementMemberOrderingTest {
+
+        final JavadocTester tester;
+
+        TypeElementMemberOrderingTest(JavadocTester tester) {
+            this.tester = tester;
+        }
 
-    final String expectedClassUseWithTypeParams[] = {
-        "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-",
-        "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass-",
-        "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass:A-",
-        "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-java.lang.String-"
-    };
+        void run() {
+            tester.javadoc("-d", "out-5",
+                    "-javafx",
+                    "-sourcepath", tester.testSrc(new File(".").getPath()),
+                    "pkg5"
+            );
+
+            tester.checkExit(Exit.OK);
 
-    final String expectedPackageOrdering[] = {
-        "\"add0/package-summary.html\">add0</a> - package add0",
-        "\"add0/add/package-summary.html\">add0.add</a> - package add0.add",
-        "\"add0/add/add/package-summary.html\">add0.add.add</a> - package add0.add.add",
-        "\"add0/add/add/add/package-summary.html\">add0.add.add.add</a> - package add0.add.add.add",
-        "\"add1/package-summary.html\">add1</a> - package add1",
-        "\"add1/add/package-summary.html\">add1.add</a> - package add1.add",
-        "\"add1/add/add/package-summary.html\">add1.add.add</a> - package add1.add.add",
-        "\"add1/add/add/add/package-summary.html\">add1.add.add.add</a> - package add1.add.add.add",
-        "\"add2/package-summary.html\">add2</a> - package add2",
-        "\"add2/add/package-summary.html\">add2.add</a> - package add2.add",
-        "\"add2/add/add/package-summary.html\">add2.add.add</a> - package add2.add.add",
-        "\"add2/add/add/add/package-summary.html\">add2.add.add.add</a> - package add2.add.add.add",
-        "\"add3/package-summary.html\">add3</a> - package add3",
-        "\"add3/add/package-summary.html\">add3.add</a> - package add3.add",
-        "\"add3/add/add/package-summary.html\">add3.add.add</a> - package add3.add.add",
-        "\"add3/add/add/add/package-summary.html\">add3.add.add.add</a> - package add3.add.add.add"
-    };
+            tester.checkOrder("pkg5/AnnoFieldTest.html",
+                    "<h3>Field Detail</h3>",
+                    "<pre>static final&nbsp;int&nbsp;one</pre>",
+                    "<pre>static final&nbsp;int&nbsp;two</pre>",
+                    "<pre>static final&nbsp;int&nbsp;three</pre>",
+                    "<pre>static final&nbsp;int&nbsp;four</pre>");
 
-    final String expectedMethodOrdering[] = {
-        "Add.html#add--",
-        "Add.html#add-double-",
-        "Add.html#add-double-byte-",
-        "Add.html#add-double-double-",
-        "Add.html#add-double-java.lang.Double-",
-        "Add.html#add-float-",
-        "Add.html#add-float-int-",
-        "Add.html#add-int-",
-        "Add.html#add-int-float-",
-        "Add.html#add-java.lang.Double-",
-        "Add.html#add-java.lang.Integer-"
-    };
-
-    final String expectedEnumOrdering[] = {
-        "Add.add.html\" title=\"enum in REPLACE_ME\"",
-        "Add.ADD.html\" title=\"enum in REPLACE_ME\""
-    };
+            tester.checkOrder("pkg5/AnnoOptionalTest.html",
+                    "<h3>Optional Element Summary</h3>",
+                    "<a href=\"../pkg5/AnnoOptionalTest.html#four--\">four</a>",
+                    "<a href=\"../pkg5/AnnoOptionalTest.html#one--\">one</a>",
+                    "<a href=\"../pkg5/AnnoOptionalTest.html#three--\">three</a>",
+                    "<a href=\"../pkg5/AnnoOptionalTest.html#two--\">two</a>",
+                    "<h3>Element Detail</h3>",
+                    "<h4>one</h4>",
+                    "<h4>two</h4>",
+                    "<h4>three</h4>",
+                    "<h4>four</h4>");
 
-    final String expectedFieldOrdering[] = {
-        "Add.html#addadd\"",
-        "add0/add/add/add/Add.html#addadd\"",
-        "add0/add/add/Add.html#addadd\"",
-        "add0/add/Add.html#addadd\"",
-        "add0/Add.html#addadd\"",
-        "add1/add/add/add/Add.html#addadd\"",
-        "add1/add/add/Add.html#addadd\"",
-        "add1/add/Add.html#addadd\"",
-        "add1/Add.html#addadd\"",
-        "add2/add/add/add/Add.html#addadd\"",
-        "add2/add/add/Add.html#addadd\"",
-        "add2/add/Add.html#addadd\"",
-        "add2/Add.html#addadd\"",
-        "add3/add/add/add/Add.html#addadd\"",
-        "add3/add/add/Add.html#addadd\"",
-        "add3/add/Add.html#addadd\"",
-        "add3/Add.html#addadd\"",
-        "Add.html#AddAdd\"",
-        "add0/add/add/add/Add.html#AddAdd\"",
-        "add0/add/add/Add.html#AddAdd\"",
-        "add0/add/Add.html#AddAdd\"",
-        "add0/Add.html#AddAdd\"",
-        "add1/add/add/add/Add.html#AddAdd\"",
-        "add1/add/add/Add.html#AddAdd\"",
-        "add1/add/Add.html#AddAdd\"",
-        "add1/Add.html#AddAdd\"",
-        "add2/add/add/add/Add.html#AddAdd\"",
-        "add2/add/add/Add.html#AddAdd\"",
-        "add2/add/Add.html#AddAdd\"",
-        "add2/Add.html#AddAdd\"",
-        "add3/add/add/add/Add.html#AddAdd\"",
-        "add3/add/add/Add.html#AddAdd\"",
-        "add3/add/Add.html#AddAdd\"",
-        "add3/Add.html#AddAdd\"",
-        "Add.html#ADDADD\"",
-        "add0/add/add/add/Add.html#ADDADD\"",
-        "add0/add/add/Add.html#ADDADD\"",
-        "add0/add/Add.html#ADDADD\"",
-        "add0/Add.html#ADDADD\"",
-        "add1/add/add/add/Add.html#ADDADD\"",
-        "add1/add/add/Add.html#ADDADD\"",
-        "add1/add/Add.html#ADDADD\"",
-        "add1/Add.html#ADDADD\"",
-        "add2/add/add/add/Add.html#ADDADD\"",
-        "add2/add/add/Add.html#ADDADD\"",
-        "add2/add/Add.html#ADDADD\"",
-        "add2/Add.html#ADDADD\"",
-        "add3/add/add/add/Add.html#ADDADD\"",
-        "add3/add/add/Add.html#ADDADD\"",
-        "add3/add/Add.html#ADDADD\"",
-        "add3/Add.html#ADDADD\""
-    };
+            tester.checkOrder("pkg5/AnnoRequiredTest.html",
+                    "<h3>Required Element Summary</h3>",
+                    "<a href=\"../pkg5/AnnoRequiredTest.html#four--\">four</a>",
+                    "<a href=\"../pkg5/AnnoRequiredTest.html#one--\">one</a>",
+                    "<a href=\"../pkg5/AnnoRequiredTest.html#three--\">three</a>",
+                    "<a href=\"../pkg5/AnnoRequiredTest.html#two--\">two</a>",
+                    "<h3>Element Detail</h3>",
+                    "<h4>one</h4>",
+                    "<h4>two</h4>",
+                    "<h4>three</h4>",
+                    "<h4>four</h4>");
 
-    final String expectedPackageTreeOrdering[] = {
-        "<a href=\"../../add0/add/Add.add.html\" title=\"enum in add0.add\">",
-        "<a href=\"../../add0/add/Add.ADD.html\" title=\"enum in add0.add\">"
-    };
+            tester.checkOrder("pkg5/CtorTest.html",
+                    "<h3>Constructor Summary</h3>",
+                    "<a href=\"../pkg5/CtorTest.html#CtorTest-int-\"",
+                    "<a href=\"../pkg5/CtorTest.html#CtorTest-int-int-\"",
+                    "<a href=\"../pkg5/CtorTest.html#CtorTest-int-int-int-\"",
+                    "<a href=\"../pkg5/CtorTest.html#CtorTest-int-int-int-int-\"",
+                    "<h3>Constructor Detail</h3>",
+                    "<a name=\"CtorTest-int-int-int-int-\">",
+                    "<a name=\"CtorTest-int-int-int-\">",
+                    "<a name=\"CtorTest-int-int-\">",
+                    "<a name=\"CtorTest-int-\">");
+
+            tester.checkOrder("pkg5/EnumTest.html",
+                    "<h3>Enum Constant Summary</h3>",
+                    "<a href=\"../pkg5/EnumTest.html#FOUR\">FOUR</a>",
+                    "<a href=\"../pkg5/EnumTest.html#ONE\">ONE</a>",
+                    "<a href=\"../pkg5/EnumTest.html#THREE\">THREE</a>",
+                    "<a href=\"../pkg5/EnumTest.html#TWO\">TWO</a>",
+                    "<h3>Enum Constant Detail</h3>",
+                    "<h4>ONE</h4>",
+                    "<h4>TWO</h4>",
+                    "<h4>THREE</h4>",
+                    "<h4>FOUR</h4>");
 
-    final String expectedOverviewOrdering[] = {
-        "<a href=\"Add.add.html\" title=\"enum in &lt;Unnamed&gt;\">",
-        "<a href=\"add0/Add.add.html\" title=\"enum in add0\">",
-        "<a href=\"add0/add/Add.add.html\" title=\"enum in add0.add\">",
-        "<a href=\"add0/add/add/Add.add.html\" title=\"enum in add0.add.add\">",
-        "<a href=\"add0/add/add/add/Add.add.html\" title=\"enum in add0.add.add.add\">",
-        "<a href=\"add1/Add.add.html\" title=\"enum in add1\">",
-        "<a href=\"add1/add/Add.add.html\" title=\"enum in add1.add\">",
-        "<a href=\"add1/add/add/Add.add.html\" title=\"enum in add1.add.add\">",
-        "<a href=\"add1/add/add/add/Add.add.html\" title=\"enum in add1.add.add.add\">",
-        "<a href=\"add2/Add.add.html\" title=\"enum in add2\">",
-        "<a href=\"add2/add/Add.add.html\" title=\"enum in add2.add\">",
-        "<a href=\"add2/add/add/Add.add.html\" title=\"enum in add2.add.add\">",
-        "<a href=\"add2/add/add/add/Add.add.html\" title=\"enum in add2.add.add.add\">",
-        "<a href=\"add3/Add.add.html\" title=\"enum in add3\">",
-        "<a href=\"add3/add/Add.add.html\" title=\"enum in add3.add\">",
-        "<a href=\"add3/add/add/Add.add.html\" title=\"enum in add3.add.add\">",
-        "<a href=\"add3/add/add/add/Add.add.html\" title=\"enum in add3.add.add.add\">",
-        "<a href=\"Add.ADD.html\" title=\"enum in &lt;Unnamed&gt;\">",
-        "<a href=\"add0/Add.ADD.html\" title=\"enum in add0\">",
-        "<a href=\"add0/add/Add.ADD.html\" title=\"enum in add0.add\">",
-        "<a href=\"add0/add/add/Add.ADD.html\" title=\"enum in add0.add.add\">",
-        "<a href=\"add0/add/add/add/Add.ADD.html\" title=\"enum in add0.add.add.add\">",
-        "<a href=\"add1/Add.ADD.html\" title=\"enum in add1\">",
-        "<a href=\"add1/add/Add.ADD.html\" title=\"enum in add1.add\">",
-        "<a href=\"add1/add/add/Add.ADD.html\" title=\"enum in add1.add.add\">",
-        "<a href=\"add1/add/add/add/Add.ADD.html\" title=\"enum in add1.add.add.add\">",
-        "<a href=\"add2/Add.ADD.html\" title=\"enum in add2\">",
-        "<a href=\"add2/add/Add.ADD.html\" title=\"enum in add2.add\">",
-        "<a href=\"add2/add/add/Add.ADD.html\" title=\"enum in add2.add.add\">",
-        "<a href=\"add2/add/add/add/Add.ADD.html\" title=\"enum in add2.add.add.add\">",
-        "<a href=\"add3/Add.ADD.html\" title=\"enum in add3\">",
-        "<a href=\"add3/add/Add.ADD.html\" title=\"enum in add3.add\">",
-        "<a href=\"add3/add/add/Add.ADD.html\" title=\"enum in add3.add.add\">",
-        "<a href=\"add3/add/add/add/Add.ADD.html\" title=\"enum in add3.add.add.add\">",
-    };
+            tester.checkOrder("pkg5/FieldTest.html",
+                    "<h3>Field Summary</h3>",
+                    "<a href=\"../pkg5/FieldTest.html#four\">four</a>",
+                    "<a href=\"../pkg5/FieldTest.html#one\">one</a>",
+                    "<a href=\"../pkg5/FieldTest.html#three\">three</a>",
+                    "<a href=\"../pkg5/FieldTest.html#two\">two</a>",
+                    "<h3>Field Detail</h3>",
+                    "<h4>one</h4>",
+                    "<h4>two</h4>",
+                    "<h4>three</h4>",
+                    "<h4>four</h4>");
+
+            tester.checkOrder("pkg5/IntfTest.html",
+                    "<h3>Method Summary</h3>",
+                    "<a href=\"../pkg5/IntfTest.html#four--\">four</a>",
+                    "<a href=\"../pkg5/IntfTest.html#one--\">one</a>",
+                    "<a href=\"../pkg5/IntfTest.html#three--\">three</a>",
+                    "<a href=\"../pkg5/IntfTest.html#two--\">two</a>",
+                    "<h3>Method Detail</h3>",
+                    "<h4>one</h4>",
+                    "<h4>two</h4>",
+                    "<h4>three</h4>",
+                    "<h4>four</h4>");
 
-    final static String expectedOverviewFrameOrdering[] = {
-        "<a href=\"package-frame.html\" target=\"packageFrame\">&lt;unnamed package&gt;</a>",
-        "<a href=\"add0/package-frame.html\" target=\"packageFrame\">add0</a>",
-        "<a href=\"add0/add/package-frame.html\" target=\"packageFrame\">add0.add</a>",
-        "<a href=\"add0/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add</a>",
-        "<a href=\"add0/add/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add.add</a>",
-        "<a href=\"add1/package-frame.html\" target=\"packageFrame\">add1</a>",
-        "<a href=\"add1/add/package-frame.html\" target=\"packageFrame\">add1.add</a>",
-        "<a href=\"add1/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add</a>",
-        "<a href=\"add1/add/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add.add</a>",
-        "<a href=\"add2/package-frame.html\" target=\"packageFrame\">add2</a>",
-        "<a href=\"add2/add/package-frame.html\" target=\"packageFrame\">add2.add</a>",
-        "<a href=\"add2/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add</a>",
-        "<a href=\"add2/add/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add.add</a>",
-        "<a href=\"add3/package-frame.html\" target=\"packageFrame\">add3</a>",
-        "<a href=\"add3/add/package-frame.html\" target=\"packageFrame\">add3.add</a>",
-        "<a href=\"add3/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add</a>",
-        "<a href=\"add3/add/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add.add</a></li>"
-    };
+            tester.checkOrder("pkg5/MethodTest.html",
+                    "<h3>Method Summary</h3>",
+                    "<a href=\"../pkg5/MethodTest.html#four--\">four</a>",
+                    "<a href=\"../pkg5/MethodTest.html#one--\">one</a>",
+                    "<a href=\"../pkg5/MethodTest.html#three--\">three</a>",
+                    "<a href=\"../pkg5/MethodTest.html#two--\">two</a>",
+                    "<h3>Method Detail</h3>",
+                    "<h4>one</h4>",
+                    "<h4>two</h4>",
+                    "<h4>three</h4>",
+                    "<h4>four</h4>");
 
-    final static String expectedImplementsOrdering[] = {
-        "<dd><code>close</code>&nbsp;in interface&nbsp;<code>java.lang.AutoCloseable</code></dd>",
-        "<dd><code>close</code>&nbsp;in interface&nbsp;<code>java.nio.channels.Channel</code></dd>",
-        "<dd><code>close</code>&nbsp;in interface&nbsp;<code>java.io.Closeable</code></dd>"
-    };
-
-    final static String expectedOverrideOrdering[] = {
-        "<dd><code>iterator</code>&nbsp;in interface&nbsp;<code>java.util.Collection&lt;",
-        "<dd><code>iterator</code>&nbsp;in interface&nbsp;<code>java.lang.Iterable&lt;"
-    };
+            tester.checkOrder("pkg5/PropertyTest.html",
+                    "<h3>Property Summary</h3>",
+                    "<a href=\"../pkg5/PropertyTest.html#fourProperty\">four</a>",
+                    "<a href=\"../pkg5/PropertyTest.html#oneProperty\">one</a>",
+                    "<a href=\"../pkg5/PropertyTest.html#threeProperty\">three</a>",
+                    "<a href=\"../pkg5/PropertyTest.html#twoProperty\">two</a>",
+                    "<h3>Property Detail</h3>",
+                    "<h4>oneProperty</h4>",
+                    "<h4>twoProperty</h4>",
+                    "<h4>threeProperty</h4>",
+                    "<h4>fourProperty</h4>");
+        }
+    }
 }
--- a/langtools/test/jdk/javadoc/doclet/testOrdering/order/MethodOrder.java	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2014, 2015, 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.
- */
-
-package order;
-
-/**
- * This class ensures the method detail section contains the methods
- * in the order as it appears in the source.
- * @author kumasrin
- */
-public class MethodOrder {
-    /**
-     * Method d.
-     * Second line.
-     */
-    public void d(){}
-    /**
-     * Method b.
-     * Second line.
-     */
-    public void b() {}
-    /**
-     * Method c.
-     * Second line.
-     */
-    public void c() {}
-    /**
-     * Method a.
-     * Second line.
-     */
-    public void a() {}
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/AnnoFieldTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public @interface AnnoFieldTest {
+    public int one = 1;
+    public int two = 2;
+    public int three = 3;
+    public int four = 4;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/AnnoOptionalTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public @interface AnnoOptionalTest {
+    int one() default 1;
+    int two() default 2;
+    int three() default 3;
+    int four() default 4;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/AnnoRequiredTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public @interface AnnoRequiredTest {
+    int one();
+    int two();
+    int three();
+    int four();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/CtorTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public class CtorTest {
+    public CtorTest(int one, int two, int three, int four) {}
+    public CtorTest(int one, int two, int three) {}
+    public CtorTest(int one, int two) {}
+    public CtorTest(int one) {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/EnumTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public enum EnumTest {
+    ONE,
+    TWO,
+    THREE,
+    FOUR
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/FieldTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public class FieldTest {
+    public int one;
+    public int two;
+    public int three;
+    public int four;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/IntfTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public interface IntfTest {
+    void one();
+    void two();
+    void three();
+    void four();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/MethodTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public class MethodTest {
+    public void one(){}
+    public void two(){}
+    public void three(){}
+    public void four(){}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/PropertyTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package pkg5;
+
+public class PropertyTest {
+    public int oneProperty() { return 1; }
+    public int twoProperty() { return 2; }
+    public int threeProperty() { return 3; }
+    public int fourProperty() { return 4; }
+}
--- a/langtools/test/jdk/javadoc/tool/modules/Modules.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/test/jdk/javadoc/tool/modules/Modules.java	Tue Nov 22 11:45:55 2016 -0800
@@ -296,7 +296,7 @@
         checkMembersSelected("pkg2.B.f");
     }
 
-//    @Test @ignore JDK-8166379
+    @Test
     public void testPatchModuleOption(Path base) throws Exception {
         Path src = base.resolve("src");
         Path modulePath = base.resolve("modules");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/modules/AnnotationProcessingWithModuleInfoInWrongPlace.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2016, 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 8168312
+ * @summary javac throws NPE if annotation processor is specified and module is declared in a file named arbitrarily
+ * @library /tools/lib
+ * @modules
+ *      jdk.compiler/com.sun.tools.javac.api
+ *      jdk.compiler/com.sun.tools.javac.main
+ * @build toolbox.ToolBox toolbox.JavacTask ModuleTestBase
+ * @run main AnnotationProcessingWithModuleInfoInWrongPlace
+ */
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.TypeElement;
+
+import toolbox.JavacTask;
+import toolbox.Task;
+
+public class AnnotationProcessingWithModuleInfoInWrongPlace extends ModuleTestBase {
+
+    public static void main(String... args) throws Exception {
+        new AnnotationProcessingWithModuleInfoInWrongPlace().runTests();
+    }
+
+    @Test
+    public void testModuleInfoInWrongPlace(Path base) throws Exception {
+        Path moduleSrc = base.resolve("module-src");
+        Path m = moduleSrc.resolve("m");
+
+        Path classes = base.resolve("classes");
+
+        Files.createDirectories(classes);
+
+        tb.writeJavaFiles(m, "module m {}");
+
+        Path mi = m.resolve("module-info.java");
+        Path f = m.resolve("F.java");
+
+        tb.moveFile(mi, f);
+
+        String log = new JavacTask(tb)
+                .options("-XDrawDiagnostics",
+                         "--module-source-path", moduleSrc.toString(),
+                         "-processor", AP.class.getName())
+                .outdir(classes)
+                .files(findJavaFiles(moduleSrc))
+                .run(Task.Expect.FAIL)
+                .writeAll()
+                .getOutput(Task.OutputKind.DIRECT);
+
+
+        if (!log.contains("F.java:1:1: compiler.err.module.decl.sb.in.module-info.java"))
+            throw new AssertionError("Unexpected output: " + log);
+    }
+
+    @SupportedAnnotationTypes("*")
+    public static final class AP extends AbstractProcessor {
+
+        @Override
+        public boolean process(Set<? extends TypeElement> annot, RoundEnvironment env) {
+            return false;
+        }
+
+        @Override
+        public SourceVersion getSupportedSourceVersion() {
+            return SourceVersion.latest();
+        }
+    }
+}
--- a/langtools/test/tools/javac/modules/PatchModulesTest.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/test/tools/javac/modules/PatchModulesTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -91,12 +91,28 @@
     }
 
     @Test
-    public void testLastOneWins(Path base) throws Exception {
+    public void testDuplicates(Path base) throws Exception {
         test(asList("java.base=a", "java.compiler=b", "java.base=c"),
-            "{java.base=[c], java.compiler=[b]}");
+            false, "--patch-module specified more than once for java.base");
+    }
+
+    @Test
+    public void testEmpty(Path base) throws Exception {
+        test(asList(""),
+            false, "no value for --patch-module option");
+    }
+
+    @Test
+    public void testInvalid(Path base) throws Exception {
+        test(asList("java.base/java.lang=."),
+            false, "bad value for --patch-module option: 'java.base/java.lang=.'");
     }
 
     void test(List<String> patches, String expect) throws Exception {
+        test(patches, true, expect);
+    }
+
+    void test(List<String> patches, boolean expectOK, String expect) throws Exception {
         JavacTool tool = (JavacTool) ToolProvider.getSystemJavaCompiler();
         StringWriter sw = new StringWriter();
         try (PrintWriter pw = new PrintWriter(sw)) {
@@ -121,6 +137,17 @@
                 tb.out.println("Found:  " + found);
                 error("output not as expected");
             }
+        } catch (IllegalArgumentException e) {
+            if (expectOK) {
+                error("unexpected exception: " + e);
+                throw e;
+            }
+            String found = e.getMessage();
+            if (!found.equals(expect)) {
+                tb.out.println("Expect: " + expect);
+                tb.out.println("Found:  " + found);
+                error("output not as expected");
+            }
         }
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalClassesModel.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2016, 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 8166700
+ * @summary Check that local classes originating in static initializer can be loaded properly.
+ * @modules jdk.compiler
+ * @build LocalTest$1Local LocalTest$2Local LocalTest$3Local LocalTest$4Local LocalTest$5Local LocalTest
+ * @compile LocalClassesModel.java
+ * @compile/process/ref=LocalClassesModel.out -processor LocalClassesModel LocalTest$1Local LocalTest$2Local LocalTest$3Local LocalTest$4Local LocalTest$5Local LocalTest
+ */
+
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.util.ElementFilter;
+
+@SupportedAnnotationTypes("*")
+public class LocalClassesModel extends AbstractProcessor {
+
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        for (TypeElement root : ElementFilter.typesIn(roundEnv.getRootElements())) {
+            System.out.println(processingEnv.getElementUtils().getBinaryName(root));
+            for (ExecutableElement constr : ElementFilter.constructorsIn(root.getEnclosedElements())) {
+                System.out.print("  (");
+                boolean first = true;
+                for (VariableElement param : constr.getParameters()) {
+                    if (!first) {
+                        System.out.print(", ");
+                    }
+                    first = false;
+                    System.out.print(param.asType().toString());
+                }
+                System.out.println(")");
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    public SourceVersion getSupportedSourceVersion() {
+        return SourceVersion.latestSupported();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalClassesModel.out	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,12 @@
+LocalTest$1Local
+  ()
+LocalTest$2Local
+  (LocalTest)
+LocalTest$3Local
+  ()
+LocalTest$4Local
+  (LocalTest)
+LocalTest$5Local
+  (LocalTest)
+LocalTest
+  ()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$1Local.jcod	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,77 @@
+class LocalTest$1Local {
+  0xCAFEBABE;
+  0; // minor version
+  52; // version
+  [] { // Constant Pool
+    ; // first element is empty
+    Method #3 #12; // #1    
+    class #13; // #2    
+    class #16; // #3    
+    Utf8 "<init>"; // #4    
+    Utf8 "()V"; // #5    
+    Utf8 "Code"; // #6    
+    Utf8 "LineNumberTable"; // #7    
+    Utf8 "SourceFile"; // #8    
+    Utf8 "LocalTest.java"; // #9    
+    Utf8 "EnclosingMethod"; // #10    
+    class #17; // #11    
+    NameAndType #4 #5; // #12    
+    Utf8 "LocalTest$1Local"; // #13    
+    Utf8 "Local"; // #14    
+    Utf8 "InnerClasses"; // #15    
+    Utf8 "java/lang/Object"; // #16    
+    Utf8 "LocalTest"; // #17    
+  } // Constant Pool
+
+  0x0020; // access
+  #2;// this_cpx
+  #3;// super_cpx
+
+  [] { // Interfaces
+  } // Interfaces
+
+  [] { // fields
+  } // fields
+
+  [] { // methods
+    { // Member
+      0x0000; // access
+      #4; // name_cpx
+      #5; // sig_cpx
+      [] { // Attributes
+        Attr(#6) { // Code
+          1; // max_stack
+          1; // max_locals
+          Bytes[]{
+            0x2AB70001B1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#7) { // LineNumberTable
+              [] { // LineNumberTable
+                0  3;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+  } // methods
+
+  [] { // Attributes
+    Attr(#8) { // SourceFile
+      #9;
+    } // end SourceFile
+    ;
+    Attr(#10) { // EnclosingMethod
+      #11 #0;
+    } // end EnclosingMethod
+    ;
+    Attr(#15) { // InnerClasses
+      [] { // InnerClasses
+        #2 #0 #14 0;
+      }
+    } // end InnerClasses
+  } // Attributes
+} // end class LocalTest$1Local
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$2Local.jcod	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,90 @@
+class LocalTest$2Local {
+  0xCAFEBABE;
+  0; // minor version
+  52; // version
+  [] { // Constant Pool
+    ; // first element is empty
+    Field #3 #15; // #1    
+    Method #4 #16; // #2    
+    class #17; // #3    
+    class #20; // #4    
+    Utf8 "this$0"; // #5    
+    Utf8 "LLocalTest;"; // #6    
+    Utf8 "<init>"; // #7    
+    Utf8 "(LLocalTest;)V"; // #8    
+    Utf8 "Code"; // #9    
+    Utf8 "LineNumberTable"; // #10    
+    Utf8 "SourceFile"; // #11    
+    Utf8 "LocalTest.java"; // #12    
+    Utf8 "EnclosingMethod"; // #13    
+    class #21; // #14    
+    NameAndType #5 #6; // #15    
+    NameAndType #7 #22; // #16    
+    Utf8 "LocalTest$2Local"; // #17    
+    Utf8 "Local"; // #18    
+    Utf8 "InnerClasses"; // #19    
+    Utf8 "java/lang/Object"; // #20    
+    Utf8 "LocalTest"; // #21    
+    Utf8 "()V"; // #22    
+  } // Constant Pool
+
+  0x0020; // access
+  #3;// this_cpx
+  #4;// super_cpx
+
+  [] { // Interfaces
+  } // Interfaces
+
+  [] { // fields
+    { // Member
+      0x1010; // access
+      #5; // name_cpx
+      #6; // sig_cpx
+      [] { // Attributes
+      } // Attributes
+    } // Member
+  } // fields
+
+  [] { // methods
+    { // Member
+      0x0000; // access
+      #7; // name_cpx
+      #8; // sig_cpx
+      [] { // Attributes
+        Attr(#9) { // Code
+          2; // max_stack
+          2; // max_locals
+          Bytes[]{
+            0x2A2BB500012AB700;
+            0x02B1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#10) { // LineNumberTable
+              [] { // LineNumberTable
+                0  6;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+  } // methods
+
+  [] { // Attributes
+    Attr(#11) { // SourceFile
+      #12;
+    } // end SourceFile
+    ;
+    Attr(#13) { // EnclosingMethod
+      #14 #0;
+    } // end EnclosingMethod
+    ;
+    Attr(#19) { // InnerClasses
+      [] { // InnerClasses
+        #3 #0 #18 0;
+      }
+    } // end InnerClasses
+  } // Attributes
+} // end class LocalTest$2Local
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$3Local.jcod	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,79 @@
+class LocalTest$3Local {
+  0xCAFEBABE;
+  0; // minor version
+  52; // version
+  [] { // Constant Pool
+    ; // first element is empty
+    Method #3 #13; // #1    
+    class #14; // #2    
+    class #17; // #3    
+    Utf8 "<init>"; // #4    
+    Utf8 "()V"; // #5    
+    Utf8 "Code"; // #6    
+    Utf8 "LineNumberTable"; // #7    
+    Utf8 "SourceFile"; // #8    
+    Utf8 "LocalTest.java"; // #9    
+    Utf8 "EnclosingMethod"; // #10    
+    class #18; // #11    
+    NameAndType #19 #5; // #12    
+    NameAndType #4 #5; // #13    
+    Utf8 "LocalTest$3Local"; // #14    
+    Utf8 "Local"; // #15    
+    Utf8 "InnerClasses"; // #16    
+    Utf8 "java/lang/Object"; // #17    
+    Utf8 "LocalTest"; // #18    
+    Utf8 "test1"; // #19    
+  } // Constant Pool
+
+  0x0020; // access
+  #2;// this_cpx
+  #3;// super_cpx
+
+  [] { // Interfaces
+  } // Interfaces
+
+  [] { // fields
+  } // fields
+
+  [] { // methods
+    { // Member
+      0x0000; // access
+      #4; // name_cpx
+      #5; // sig_cpx
+      [] { // Attributes
+        Attr(#6) { // Code
+          1; // max_stack
+          1; // max_locals
+          Bytes[]{
+            0x2AB70001B1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#7) { // LineNumberTable
+              [] { // LineNumberTable
+                0  9;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+  } // methods
+
+  [] { // Attributes
+    Attr(#8) { // SourceFile
+      #9;
+    } // end SourceFile
+    ;
+    Attr(#10) { // EnclosingMethod
+      #11 #12;
+    } // end EnclosingMethod
+    ;
+    Attr(#16) { // InnerClasses
+      [] { // InnerClasses
+        #2 #0 #15 0;
+      }
+    } // end InnerClasses
+  } // Attributes
+} // end class LocalTest$3Local
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$4Local.jcod	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,92 @@
+class LocalTest$4Local {
+  0xCAFEBABE;
+  0; // minor version
+  52; // version
+  [] { // Constant Pool
+    ; // first element is empty
+    Field #3 #16; // #1    
+    Method #4 #17; // #2    
+    class #18; // #3    
+    class #21; // #4    
+    Utf8 "this$0"; // #5    
+    Utf8 "LLocalTest;"; // #6    
+    Utf8 "<init>"; // #7    
+    Utf8 "(LLocalTest;)V"; // #8    
+    Utf8 "Code"; // #9    
+    Utf8 "LineNumberTable"; // #10    
+    Utf8 "SourceFile"; // #11    
+    Utf8 "LocalTest.java"; // #12    
+    Utf8 "EnclosingMethod"; // #13    
+    class #22; // #14    
+    NameAndType #23 #24; // #15    
+    NameAndType #5 #6; // #16    
+    NameAndType #7 #24; // #17    
+    Utf8 "LocalTest$4Local"; // #18    
+    Utf8 "Local"; // #19    
+    Utf8 "InnerClasses"; // #20    
+    Utf8 "java/lang/Object"; // #21    
+    Utf8 "LocalTest"; // #22    
+    Utf8 "test2"; // #23    
+    Utf8 "()V"; // #24    
+  } // Constant Pool
+
+  0x0020; // access
+  #3;// this_cpx
+  #4;// super_cpx
+
+  [] { // Interfaces
+  } // Interfaces
+
+  [] { // fields
+    { // Member
+      0x1010; // access
+      #5; // name_cpx
+      #6; // sig_cpx
+      [] { // Attributes
+      } // Attributes
+    } // Member
+  } // fields
+
+  [] { // methods
+    { // Member
+      0x0000; // access
+      #7; // name_cpx
+      #8; // sig_cpx
+      [] { // Attributes
+        Attr(#9) { // Code
+          2; // max_stack
+          2; // max_locals
+          Bytes[]{
+            0x2A2BB500012AB700;
+            0x02B1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#10) { // LineNumberTable
+              [] { // LineNumberTable
+                0  12;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+  } // methods
+
+  [] { // Attributes
+    Attr(#11) { // SourceFile
+      #12;
+    } // end SourceFile
+    ;
+    Attr(#13) { // EnclosingMethod
+      #14 #15;
+    } // end EnclosingMethod
+    ;
+    Attr(#20) { // InnerClasses
+      [] { // InnerClasses
+        #3 #0 #19 0;
+      }
+    } // end InnerClasses
+  } // Attributes
+} // end class LocalTest$4Local
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$5Local.jcod	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,90 @@
+class LocalTest$5Local {
+  0xCAFEBABE;
+  0; // minor version
+  52; // version
+  [] { // Constant Pool
+    ; // first element is empty
+    Field #3 #16; // #1    
+    Method #4 #15; // #2    
+    class #17; // #3    
+    class #20; // #4    
+    Utf8 "this$0"; // #5    
+    Utf8 "LLocalTest;"; // #6    
+    Utf8 "<init>"; // #7    
+    Utf8 "(LLocalTest;)V"; // #8    
+    Utf8 "Code"; // #9    
+    Utf8 "LineNumberTable"; // #10    
+    Utf8 "SourceFile"; // #11    
+    Utf8 "LocalTest.java"; // #12    
+    Utf8 "EnclosingMethod"; // #13    
+    class #21; // #14    
+    NameAndType #7 #22; // #15    
+    NameAndType #5 #6; // #16    
+    Utf8 "LocalTest$5Local"; // #17    
+    Utf8 "Local"; // #18    
+    Utf8 "InnerClasses"; // #19    
+    Utf8 "java/lang/Object"; // #20    
+    Utf8 "LocalTest"; // #21    
+    Utf8 "()V"; // #22    
+  } // Constant Pool
+
+  0x0020; // access
+  #3;// this_cpx
+  #4;// super_cpx
+
+  [] { // Interfaces
+  } // Interfaces
+
+  [] { // fields
+    { // Member
+      0x1010; // access
+      #5; // name_cpx
+      #6; // sig_cpx
+      [] { // Attributes
+      } // Attributes
+    } // Member
+  } // fields
+
+  [] { // methods
+    { // Member
+      0x0000; // access
+      #7; // name_cpx
+      #8; // sig_cpx
+      [] { // Attributes
+        Attr(#9) { // Code
+          2; // max_stack
+          2; // max_locals
+          Bytes[]{
+            0x2A2BB500012AB700;
+            0x02B1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#10) { // LineNumberTable
+              [] { // LineNumberTable
+                0  15;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+  } // methods
+
+  [] { // Attributes
+    Attr(#11) { // SourceFile
+      #12;
+    } // end SourceFile
+    ;
+    Attr(#13) { // EnclosingMethod
+      #14 #15;
+    } // end EnclosingMethod
+    ;
+    Attr(#19) { // InnerClasses
+      [] { // InnerClasses
+        #3 #0 #18 0;
+      }
+    } // end InnerClasses
+  } // Attributes
+} // end class LocalTest$5Local
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest.jcod	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,160 @@
+class LocalTest {
+  0xCAFEBABE;
+  0; // minor version
+  52; // version
+  [] { // Constant Pool
+    ; // first element is empty
+    Method #3 #20; // #1    
+    class #21; // #2    
+    class #22; // #3    
+    class #23; // #4    
+    Utf8 "Local"; // #5    
+    Utf8 "InnerClasses"; // #6    
+    class #24; // #7    
+    class #25; // #8    
+    class #26; // #9    
+    class #27; // #10    
+    Utf8 "test1"; // #11    
+    Utf8 "()V"; // #12    
+    Utf8 "Code"; // #13    
+    Utf8 "LineNumberTable"; // #14    
+    Utf8 "test2"; // #15    
+    Utf8 "<init>"; // #16    
+    Utf8 "<clinit>"; // #17    
+    Utf8 "SourceFile"; // #18    
+    Utf8 "LocalTest.java"; // #19    
+    NameAndType #16 #12; // #20    
+    Utf8 "LocalTest"; // #21    
+    Utf8 "java/lang/Object"; // #22    
+    Utf8 "LocalTest$5Local"; // #23    
+    Utf8 "LocalTest$4Local"; // #24    
+    Utf8 "LocalTest$3Local"; // #25    
+    Utf8 "LocalTest$2Local"; // #26    
+    Utf8 "LocalTest$1Local"; // #27    
+  } // Constant Pool
+
+  0x0021; // access
+  #2;// this_cpx
+  #3;// super_cpx
+
+  [] { // Interfaces
+  } // Interfaces
+
+  [] { // fields
+  } // fields
+
+  [] { // methods
+    { // Member
+      0x0008; // access
+      #11; // name_cpx
+      #12; // sig_cpx
+      [] { // Attributes
+        Attr(#13) { // Code
+          0; // max_stack
+          0; // max_locals
+          Bytes[]{
+            0xB1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#14) { // LineNumberTable
+              [] { // LineNumberTable
+                0  10;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+    ;
+    { // Member
+      0x0000; // access
+      #15; // name_cpx
+      #12; // sig_cpx
+      [] { // Attributes
+        Attr(#13) { // Code
+          0; // max_stack
+          1; // max_locals
+          Bytes[]{
+            0xB1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#14) { // LineNumberTable
+              [] { // LineNumberTable
+                0  13;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+    ;
+    { // Member
+      0x0000; // access
+      #16; // name_cpx
+      #12; // sig_cpx
+      [] { // Attributes
+        Attr(#13) { // Code
+          1; // max_stack
+          1; // max_locals
+          Bytes[]{
+            0x2AB70001B1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#14) { // LineNumberTable
+              [] { // LineNumberTable
+                0  14;
+                4  16;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+    ;
+    { // Member
+      0x0008; // access
+      #17; // name_cpx
+      #12; // sig_cpx
+      [] { // Attributes
+        Attr(#13) { // Code
+          0; // max_stack
+          0; // max_locals
+          Bytes[]{
+            0xB1;
+          };
+          [] { // Traps
+          } // end Traps
+          [] { // Attributes
+            Attr(#14) { // LineNumberTable
+              [] { // LineNumberTable
+                0  4;
+              }
+            } // end LineNumberTable
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+  } // methods
+
+  [] { // Attributes
+    Attr(#18) { // SourceFile
+      #19;
+    } // end SourceFile
+    ;
+    Attr(#6) { // InnerClasses
+      [] { // InnerClasses
+        #4 #0 #5 0;
+        #7 #0 #5 0;
+        #8 #0 #5 0;
+        #9 #0 #5 0;
+        #10 #0 #5 0;
+      }
+    } // end InnerClasses
+  } // Attributes
+} // end class LocalTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest.orign	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+/**The jcod files are generated from this file, compiled by JDK 8 javac.
+ */
+public class LocalTest {
+    static {
+        class Local { }
+    }
+    {
+        class Local { }
+    }
+    static void test1() {
+        class Local { }
+    }
+    void test2() {
+        class Local { }
+    }
+    LocalTest() {
+        class Local { }
+    }
+}
+
--- a/langtools/test/tools/jdeps/DotFileTest.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/test/tools/jdeps/DotFileTest.java	Tue Nov 22 11:45:55 2016 -0800
@@ -136,8 +136,6 @@
 
         // with -P option
         List<String> argsWithDashP = new ArrayList<>();
-        argsWithDashP.add("-dotoutput");
-        argsWithDashP.add(dotoutput.toString());
         argsWithDashP.add("-P");
         argsWithDashP.addAll(args);
 
@@ -162,8 +160,6 @@
 
         // with -P option
         List<String> argsWithDashP = new ArrayList<>();
-        argsWithDashP.add("-dotoutput");
-        argsWithDashP.add(dotoutput.toString());
         argsWithDashP.add("-P");
         argsWithDashP.addAll(args);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/jdeps/Options.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, 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 8168386
+ * @summary Test option validation
+ * @modules jdk.jdeps
+ * @library lib
+ * @build JdepsRunner
+ * @run testng Options
+ */
+
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertTrue;
+
+public class Options {
+    private static final String TEST_CLASSES = System.getProperty("test.classes");
+
+    @DataProvider(name = "errors")
+    public Object[][] errors() {
+        return new Object[][]{
+            {
+                new String[] { "-summary", "-v", TEST_CLASSES },
+                "-v, -verbose cannot be used with -s, -summary option"
+            },
+            {
+                new String[] { "-jdkinternal", "-summary", TEST_CLASSES },
+                "-summary or -verbose cannot be used with -jdkinternals option"
+            },
+            {
+                new String[] { "-jdkinternal", "-p", "java.lang", TEST_CLASSES },
+                "--package, --regex, --require cannot be used with  -jdkinternals option"
+            },
+            {
+                new String[] { "--inverse", TEST_CLASSES },
+                "--package (-p), --regex (-e), --require option must be specified"
+            },
+            {
+                new String[] { "--inverse", "-R", TEST_CLASSES },
+                "-R cannot be used with --inverse option"
+            },
+            {
+                new String[] { "--generate-module-info", "dots", "-cp", TEST_CLASSES },
+                "-classpath cannot be used with --generate-module-info option"
+            },
+            {
+                new String[] { "--list-deps", "-summary", TEST_CLASSES },
+                "--list-deps and --list-reduced-deps options are specified"
+            },
+            {
+                new String[] { "--list-deps", "--list-reduced-deps", TEST_CLASSES },
+                "--list-deps and --list-reduced-deps options are specified"
+            },
+        };
+    }
+
+    @Test(dataProvider = "errors")
+    public void test(String[] options, String expected) {
+        jdepsError(options).outputContains(expected);
+    }
+
+
+    public static JdepsRunner jdepsError(String... args) {
+        JdepsRunner jdeps = new JdepsRunner(args);
+        assertTrue(jdeps.run(true) != 0);
+        return jdeps;
+    }
+}
--- a/langtools/test/tools/jdeps/lib/JdepsRunner.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/test/tools/jdeps/lib/JdepsRunner.java	Tue Nov 22 11:45:55 2016 -0800
@@ -75,7 +75,7 @@
     }
 
     public boolean outputContains(String s) {
-        return stdout.toString().contains(s);
+        return stdout.toString().contains(s) || stderr.toString().contains(s);
     }
 
     public void printStdout(PrintStream stream) {
--- a/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java	Tue Nov 22 11:45:55 2016 -0800
@@ -24,7 +24,7 @@
 /*
  * @test
  * @bug 8167057
- * @summary Tests split packages
+ * @summary Tests --list-deps and --list-reduced-deps options
  * @modules java.logging
  *          java.xml
  *          jdk.compiler
@@ -53,6 +53,8 @@
     private static final Path CLASSES_DIR = Paths.get("classes");
     private static final Path LIB_DIR = Paths.get("lib");
 
+    private static final Path HI_CLASS =
+        CLASSES_DIR.resolve("hi").resolve("Hi.class");
     private static final Path FOO_CLASS =
         CLASSES_DIR.resolve("z").resolve("Foo.class");
     private static final Path BAR_CLASS =
@@ -68,6 +70,9 @@
         // compile library
         assertTrue(CompilerUtils.compile(Paths.get(TEST_SRC, "src", "lib"), LIB_DIR));
 
+        // simple program depends only on java.base
+        assertTrue(CompilerUtils.compile(Paths.get(TEST_SRC, "src", "hi"), CLASSES_DIR));
+
         // compile classes in unnamed module
         assertTrue(CompilerUtils.compile(Paths.get(TEST_SRC, "src", "z"),
             CLASSES_DIR,
@@ -117,6 +122,11 @@
                             }
             },
 
+            { HI_CLASS,     new String[] {
+                                "java.base"
+                            }
+            },
+
             { FOO_CLASS,    new String[] {
                                 "java.base",
                                 "java.logging",
@@ -155,9 +165,12 @@
                             }
             },
 
+            { HI_CLASS,     new String[] {
+                                "java.base"
+                            }
+            },
 
             { FOO_CLASS,    new String[] {
-                                "java.base",
                                 "java.sql",
                                 "unnamed module: lib"
                             }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/jdeps/listdeps/src/hi/Hi.java	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package hi;
+
+public class Hi {
+}
--- a/make/Bundles.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/Bundles.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -101,7 +101,7 @@
 	          ( $(TAR) cf - $(TAR_CREATE_EXTRA_PARAM) $$($1_SUBDIR) $(TAR_IGNORE_EXIT_VALUE) ) \
 	          | $(GZIP) > $$@
             else ifeq ($$($1_TYPE), zip)
-	      $(CD) $(SUPPORT_OUTPUTDIR)/bundles/$1 && $(ZIP) -qr $$@ .
+	      $(CD) $(SUPPORT_OUTPUTDIR)/bundles/$1 && $(ZIPEXE) -qr $$@ .
             endif
           endif
         else
@@ -113,7 +113,7 @@
 	        | $(GZIP) > $$@
           else ifeq ($$($1_TYPE), zip)
 	    $(CD) $$($1_BASE_DIR) \
-	        && $(ZIP) -qr $$@ . -i@$(SUPPORT_OUTPUTDIR)/bundles/_$1_files
+	        && $(ZIPEXE) -qr $$@ . -i@$(SUPPORT_OUTPUTDIR)/bundles/_$1_files
           endif
         endif
 
--- a/make/Javadoc.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/Javadoc.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -50,17 +50,6 @@
 # Should we use -Xdocrootparent? Allow custom to overwrite.
 DOCROOTPARENT_FLAG = TRUE
 
-# The core api index file is the target for the core api javadocs rule
-# and needs to be defined early so that all other javadoc rules may
-# depend on it.
-CORE_INDEX_FILE := $(JAVADOC_OUTPUTDIR)/api/index.html
-
-# Symbols
-TRADEMARK := &trade;
-COPYRIGHT_SYMBOL := &$(HASH)x00a9;
-COPYRIGHT_TEXT := Copyright
-ALL_RIGHTS_RESERVED := All rights reserved.
-
 # URLs
 JAVADOC_BASE_URL := http://docs.oracle.com/javase/$(VERSION_SPECIFICATION)/docs
 BUG_SUBMIT_URL := http://bugreport.java.com/bugreport/
@@ -69,79 +58,131 @@
 # Text snippets
 
 FULL_COMPANY_NAME := Oracle and/or its affiliates
-COMPANY_ADDRESS := 500 Oracle Parkway<br>Redwood Shores, CA 94065 USA.
+COMPANY_ADDRESS := 500 Oracle Parkway<br>Redwood Shores, CA 94065 USA
 BUG_SUBMIT_LINE := <a href="$(BUG_SUBMIT_URL)">Submit a bug or feature</a>
-JAVA_TRADEMARK_LINE := Java is a trademark or registered trademark of \
-    $(FULL_COMPANY_NAME) in the US and other countries.
 
-COMMON_BOTTOM_ADDRESS := $(COMPANY_ADDRESS)
-COMMON_BOTTOM_TEXT := $(BUG_SUBMIT_LINE)<br>$(JAVA_TRADEMARK_LINE)
+COMMON_BOTTOM_TEXT := $(BUG_SUBMIT_LINE)<br> Java is a trademark or registered \
+    trademark of $(FULL_COMPANY_NAME) in the US and other countries.
 
 CORE_BOTTOM_COPYRIGHT_URL := {@docroot}/../legal/cpyr.html
-CORE_BOTTOM_TEXT := $(BUG_SUBMIT_LINE)\
-<br>For further API reference and developer documentation, \
-see <a href="$(JAVADOC_BASE_URL)/index.html" target="_blank">Java SE \
-Documentation</a>. That documentation contains more detailed, \
-developer-targeted descriptions, with conceptual overviews, definitions of \
-terms, workarounds, and working code examples.
+CORE_BOTTOM_TEXT := \
+    $(BUG_SUBMIT_LINE) \
+    <br>For further API reference and developer documentation, see \
+    <a href="$(JAVADOC_BASE_URL)/index.html" target="_blank">Java SE \
+    Documentation</a>. That documentation contains more detailed, \
+    developer-targeted descriptions, with conceptual overviews, definitions of \
+    terms, workarounds, and working code examples.
 
 ifeq ($(VERSION_IS_GA), true)
-  DRAFT_HEADER :=
-  DRAFT_BOTTOM :=
-  DRAFT_WINTITLE :=
-  CORE_TOP_EARLYACCESS :=
+  DRAFT_MARKER :=
+  DRAFT_WINDOW_TITLE_MARKER :=
+  EARLYACCESS_TOP :=
 else
   # We need a draft format when not building the GA version.
-  DRAFT_HEADER := <br><strong>DRAFT&nbsp;$(VERSION_STRING)</strong>
-  DRAFT_BOTTOM := <br><strong>DRAFT&nbsp;$(VERSION_STRING)</strong>
-  DRAFT_WINTITLE := $(VERSION_BUILD)
-  CORE_TOP_EARLYACCESS := \
-<div style="background-color: $$(HASH)EEEEEE"> \
-<div style="padding: 6px; margin-top: 2px; margin-bottom: 6px; \
-margin-left: 6px; margin-right: 6px; text-align: justify; \
-font-size: 80%; font-family: Helvetica, Arial, sans-serif; \
-font-weight: normal;"> \
-Please note that the specifications and other information \
-contained herein are not final and are subject to change. \
-The information is being made available to you solely for purpose of \
-evaluation. \
-</div> </div>
+  DRAFT_MARKER := <br><strong>DRAFT&nbsp;$(VERSION_STRING)</strong>
+  ifeq ($(VERSION_BUILD), 0)
+    DRAFT_WINDOW_TITLE_MARKER := $(SPACE)[ad-hoc build]
+  else
+    DRAFT_WINDOW_TITLE_MARKER := $(SPACE)[build $(VERSION_BUILD)]
+  endif
+  EARLYACCESS_TOP := \
+      <div style="background-color: $$(HASH)EEEEEE"><div style="padding: 6px; \
+      margin-top: 2px; margin-bottom: 6px; margin-left: 6px; margin-right: \
+      6px; text-align: justify; font-size: 80%; font-family: Helvetica, Arial, \
+      sans-serif; font-weight: normal;">Please note that the specifications \
+      and other information contained herein are not final and are subject to \
+      change. The information is being made available to you solely for \
+      purpose of evaluation.</div></div>
 endif
 
 ################################################################################
+# Special treatment for the core package list. All separate "small" javadoc
+# invocation needs to be able to see the core package list.
+
+ALL_PKG_DIRS := $(dir $(filter %.java, $(call CacheFind, \
+    $(wildcard $(JAVADOC_SOURCE_DIRS)))))
+ALL_SRC_PREFIXES := $(addsuffix /%, $(wildcard $(JAVADOC_SOURCE_DIRS)))
+ALL_PKG_DIRNAMES := $(foreach prefix, $(ALL_SRC_PREFIXES), \
+    $(patsubst $(prefix),%, $(filter $(prefix), $(ALL_PKG_DIRS))))
+ALL_PACKAGES := $(sort $(subst /,., $(patsubst %/, %, $(ALL_PKG_DIRNAMES))))
+
+# Core packages are all packages beginning with java, javax or org, except a few
+# excludes.
+JAVA_PACKAGES := $(filter java.%, $(ALL_PACKAGES))
+JAVAX_PACKAGES := $(filter javax.%, $(ALL_PACKAGES))
+ORG_PACKAGES := $(filter org.%, $(ALL_PACKAGES))
+
+# Allow custom makefile to add more excluded packages
+CORE_EXCLUDED_PACKAGES += \
+    java.awt.dnd.peer \
+    java.awt.peer \
+    javax.smartcardio \
+    org.jcp.xml.dsig.internal% \
+    org.w3c.dom.css \
+    org.w3c.dom.html \
+    org.w3c.dom.stylesheets \
+    org.w3c.dom.xpath \
+    #
+
+CORE_PACKAGES := $(filter-out $(CORE_EXCLUDED_PACKAGES), \
+    $(JAVA_PACKAGES) $(JAVAX_PACKAGES) $(ORG_PACKAGES))
+
+CORE_PACKAGES_LIST_DIR := $(SUPPORT_OUTPUTDIR)/docs/core-packages
+CORE_PACKAGES_LIST_FILE := $(CORE_PACKAGES_LIST_DIR)/package-list
+
+CORE_PACKAGES_VARDEPS_FILE := $(call DependOnVariable, CORE_PACKAGES, \
+    $(CORE_PACKAGES_LIST_FILE).vardeps)
+
+$(CORE_PACKAGES_LIST_FILE): $(CORE_PACKAGES_VARDEPS_FILE)
+	$(call MakeDir, $(@D))
+	$(eval $(call ListPathsSafely, CORE_PACKAGES, $@))
+
+################################################################################
 # Support functions for SetupJavadocGeneration
 
-# Print an option line to the target file
-# Arguments:
-# arg 1: the option name
-# arg 2-3: optional arguments to the option
-define AddOption
-	$(PRINTF) "%s$(if $(strip $2), '%s',)$(if $(strip $3), '%s',)\n" \
-	    "$(strip $1)"$(if $(strip $2), '$(strip $2)',)$(if $(strip $3), \
-	    '$(strip $3)',) >> $@
-endef
-
-# This function goes to great pains to exactly mimic the old behavior
-# in all details, including whitespace.
+# Generate the text used in the -bottom argument.
 # Note that COPYRIGHT_YEAR is the current year (from spec.gmk)
 # Arguments:
 # arg 1: first copyright year
 # arg 2: copyright url (optional)
-# arg 3: company address (optional)
-# arg 4: free-form text snippet (optional)
+# arg 3: free-form text snippet (optional)
 define GenerateBottom
-  <font size="-1">$(if $(strip $4), $(strip $4))<br> $(if \
-      $(strip $2),<a href="$(strip $2)">$(COPYRIGHT_TEXT)</a>,$(COPYRIGHT_TEXT)) \
-      $(COPYRIGHT_SYMBOL) $(strip $1), $(COPYRIGHT_YEAR), \
-      $(FULL_COMPANY_NAME). $(strip $3) \
-      $(ALL_RIGHTS_RESERVED)$(if $(strip $4), )</font>
+  <font size="-1">$(if $(strip $3), $(strip $3))<br> $(if \
+      $(strip $2),<a href="$(strip $2)">Copyright</a>,Copyright) \
+      &copy; $(strip $1), $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \
+      $(COMPANY_ADDRESS). All rights reserved.</font>
 endef
 
 # Speed up finding by filling cache
 $(eval $(call FillCacheFind, $(wildcard $(JAVADOC_SOURCE_DIRS))))
 
-# Prevent # from expanding
-EscapeHash = $(subst $(HASH),{hash},$(strip $1))
+# In order to get a specific ordering it's necessary to specify the total
+# ordering of tags as the tags are otherwise ordered in order of definition.
+DEFAULT_JAVADOC_TAGS := \
+    -tag beaninfo:X \
+    -tag revised:X \
+    -tag since.unbundled:X \
+    -tag spec:X \
+    -tag specdefault:X \
+    -tag Note:X \
+    -tag ToDo:X \
+    -tag 'apiNote:a:API Note:' \
+    -tag 'implSpec:a:Implementation Requirements:' \
+    -tag 'implNote:a:Implementation Note:' \
+    -tag param \
+    -tag return \
+    -tag throws \
+    -tag since \
+    -tag version \
+    -tag serialData \
+    -tag factory \
+    -tag see \
+    -tag 'jvms:a:See <cite>The Java&trade; Virtual Machine Specification</cite>:' \
+    -tag 'jls:a:See <cite>The Java&trade; Language Specification</cite>:' \
+    #
+
+DEFAULT_JAVADOC_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \
+    -serialwarn -encoding ISO-8859-1 -breakiterator --system none
 
 ################################################################################
 # Setup make rules for running javadoc.
@@ -154,7 +195,6 @@
 # Remaining parameters are named arguments. These include:
 #   MODULES - Modules to include
 #   PACKAGES - Packages to include
-#   PACKAGE_FILTER - Filter for packages
 #   IS_CORE - Set to TRUE for the Core API package which needs special treatment
 #   API_ROOT - Where to base the documentation (jre or jdk)
 #   DEST_DIR - A directory relative to the API root
@@ -164,15 +204,10 @@
 #   HEADER_TITLE - Title to use in -header. Computed from TITLE if empty.
 #   DOC_TITLE - Title to use in -doctitle. Computed from TITLE if empty.
 #   FIRST_COPYRIGHT_YEAR - First year this bundle was introduced
-#   DOCLINT - Doclint level. Defaults to "all".
+#   DISABLED_DOCLINT - Doclint warnings to exclude.
 #   DOCLINT_PACKAGES - Optional -Xdoclint/package value
-#   ENCODING - Change character encoding (defaults to 'ascii')
-#   SPLIT_INDEX - Enable -splitIndex
-#   BREAKITERATOR - Enable -breakiterator
-#   NODEPRECATEDLIST - Enable nodeprecatedlist
-#   NOINDEX - Enable -noindex and -nonavbar
+#   SPLIT_INDEX - Enable -splitIndex (split index-all.html if it is too large)
 #   BOTTOM_COPYRIGHT_URL - Copyright URL to use in -bottom
-#   BOTTOM_ADDRESS - Company address to use in -bottom
 #   BOTTOM_TEXT - Extra text to use in -bottom
 #   EXTRA_TOP - Additional -top data
 #
@@ -185,181 +220,104 @@
     $1_JAVA := $$(JAVA_SMALL)
     $1_OUTPUT_DIRNAME := $$($1_API_ROOT)/api/$$($1_DEST_DIR)
 
-    ifeq ($$($1_RELATIVE_CORE_DIR),)
-      # Compute a relative path to core root.
-      # The non-core api javadocs need to be able to access the root of the core
-      # api directory, so for jdk/api or jre/api to get to the core api/
-      # directory we would use this
-      # NOTE: Need to be able to override for broken old code in JShell
-      $1_RELATIVE_CORE_DIR := $$(strip $$(subst $$(call DirToDotDot, \
-          $$(JAVADOC_OUTPUTDIR))/,, $$(call DirToDotDot, \
-          $$(JAVADOC_OUTPUTDIR)/$$($1_OUTPUT_DIRNAME))))
-    endif
+    # Compute a relative path to core root.
+    # The non-core api javadocs need to be able to access the root of the core
+    # api directory, so for jdk/api or jre/api to get to the core api/
+    # directory we would use this
+    $1_RELATIVE_CORE_DIR := $$(call DirToDotDot, $$($1_OUTPUT_DIRNAME))/api
 
-    $1_DEPS += $(CORE_INDEX_FILE)
+    # We need to tell javadoc the directory in which to find the core package-list
+    $1_OPTIONS += -linkoffline $$($1_RELATIVE_CORE_DIR) $$(CORE_PACKAGES_LIST_DIR)
+
+    $1_DEPS += $(CORE_PACKAGES_LIST_FILE)
   endif
 
-  ifneq ($$($1_OVERVIEW), )
-    $1_DEPS +=  $$($1_OVERVIEW)
+  $1_OPTIONS += --add-modules $$(call CommaList, $$($1_MODULES))
+
+  ifneq ($$(LOG_LEVEL), trace)
+    $1_OPTIONS += -quiet
   endif
 
-  ifeq ($$($1_ENCODING), )
-    $1_ENCODING := ascii
+  ifneq ($$($1_DISABLED_DOCLINT), )
+    # Create a string like ",-syntax,-html"
+    $1_DOCLINT_EXCEPTIONS := ,$$(call CommaList, $$(addprefix -, $$($1_DISABLED_DOCLINT)))
   endif
+  $1_OPTIONS += -Xdoclint:all$$($1_DOCLINT_EXCEPTIONS)
 
-  ifeq ($$($1_DOCLINT), )
-    $1_DOCLINT := all
+  ifneq ($$($1_DOCLINT_PACKAGES), )
+    $1_OPTIONS += -Xdoclint/package:$$(call CommaList, $$($1_DOCLINT_PACKAGES))
   endif
 
   ifeq ($$($1_DOC_TITLE), )
     $1_DOC_TITLE := $$($1_TITLE)
   endif
+  $1_OPTIONS += -doctitle '$$($1_DOC_TITLE)'
 
   ifeq ($$($1_WINDOW_TITLE), )
-    $1_WINDOW_TITLE := $$(strip $$(subst $$(TRADEMARK),, $$($1_TITLE)))
+    $1_WINDOW_TITLE := $$(strip $$(subst &trade;,, $$($1_TITLE)))
   endif
+  $1_OPTIONS += -windowtitle '$$($1_WINDOW_TITLE)$$(DRAFT_WINDOW_TITLE_MARKER)'
 
   ifeq ($$($1_HEADER_TITLE), )
-    $1_HEADER_TITLE := $$(strip $$(subst $$(TRADEMARK),, $$($1_TITLE)))
+    $1_HEADER_TITLE := $$(strip $$(subst &trade;,, $$($1_TITLE)))
   endif
-  $1_HEADER := <strong>$$($1_HEADER_TITLE)</strong>
-
-  $1_BOTTOM := $$(call GenerateBottom, $$($1_FIRST_COPYRIGHT_YEAR), \
-      $$($1_BOTTOM_COPYRIGHT_URL), $$($1_BOTTOM_ADDRESS), $$($1_BOTTOM_TEXT))
-
-  # The index.html, options, and packages files
-  $1_INDEX_FILE := $$(JAVADOC_OUTPUTDIR)/$$($1_OUTPUT_DIRNAME)/index.html
-  $1_OPTIONS_FILE := $$(SUPPORT_OUTPUTDIR)/docs/$1.options
-  $1_PACKAGES_FILE := $$(SUPPORT_OUTPUTDIR)/docs/$1.packages
-
-  $1_PACKAGES_VARDEPS := $$($1_PACKAGES) $$($1_PACKAGES_SINGLE_CLASS)
-  $1_PACKAGES_VARDEPS_FILE := $$(call DependOnVariable, $1_PACKAGES_VARDEPS, \
-       $$($1_PACKAGES_FILE).vardeps)
+  $1_OPTIONS += -header '<strong>$$($1_HEADER_TITLE)</strong>$$(DRAFT_MARKER)'
 
-  # Rule for creating a file with the package names in it
-  $$($1_PACKAGES_FILE): $$($1_PACKAGES_VARDEPS_FILE)
-	$$(call LogInfo, Creating Javadoc package file for $1)
-	$$(call MakeDir, $$(@D))
-        ifeq ($$($1_PACKAGES_SINGLE_CLASS), )
-	  $$(ECHO) $$($1_PACKAGES) | $$(TR) ' ' '\n' > $$@
-        else
-          # NOTE: This is for backwards compatibility for taglet
-	  $$(ECHO) $$($1_PACKAGES_SINGLE_CLASS) > $$@
-        endif
+  ifneq ($$($1_EXTRA_TOP), )
+    $1_OPTIONS += -top '$$($1_EXTRA_TOP)'
+  endif
 
-  # NOTE: Not including $$($1_EXTRA_TOP) due to $$(HASH)
-  $1_OPTIONS_VARDEPS := $$(call EscapeHash, \
-      $$($DOCROOTPARENT_FLAG) $$(JAVADOC_BASE_URL) $$($1_NO_COMMON_TAGS) \
-      $$($1_DOCLINT) $$($1_DOCLINT_PACKAGES) $$(JAVADOC_SOURCE_DIRS) \
-      $$($1_MODULES) $$($1_ENCODING) $$($1_NODEPRECATEDLIST) \
-      $$($1_BREAKITERATOR) $$($1_SPLIT_INDEX) $$($1_OVERVIEW) \
-      $$($1_DOC_TITLE) $$($1_WINDOW_TITLE) $$(DRAFT_WINTITLE) \
-      $$($1_HEADER) $$(DRAFT_HEADER) $$($1_NOINDEX) $$($1_EXTRA_TOP_2) \
-      $$($1_BOTTOM) $$(DRAFT_BOTTOM)) $$($1_PACKAGE_FILTER) $$($1_RELATIVE_CORE_DIR) \
-      $$(JAVADOC_OUTPUTDIR) \
-  )
-  $1_OPTIONS_VARDEPS_FILE := $$(call DependOnVariable, $1_OPTIONS_VARDEPS, \
-       $$($1_OPTIONS_FILE).vardeps)
+  ifeq ($$($1_BOTTOM_TEXT), )
+    $1_BOTTOM_TEXT := $(COMMON_BOTTOM_TEXT)
+  endif
+  $1_BOTTOM := $$(call GenerateBottom, $$($1_FIRST_COPYRIGHT_YEAR), \
+      $$($1_BOTTOM_COPYRIGHT_URL), $$($1_BOTTOM_TEXT))
+  $1_OPTIONS += -bottom '$$($1_BOTTOM)$$(DRAFT_MARKER)'
 
-  # Rule for creating a file with javadoc options in it
-  $$($1_OPTIONS_FILE): $$($1_OPTIONS_VARDEPS_FILE)
-	$$(call LogInfo, Creating Javadoc options file for $1)
-	$$(call MakeDir, $$(@D))
-	$$(RM) $$@
-	$$(call AddOption, -XDignore.symbol.file=true)
-        ifneq ($$(LOG_LEVEL), trace)
-	  $$(call AddOption, -quiet)
-        endif
-	$$(call AddOption, -use)
-	$$(call AddOption, -keywords)
-        ifneq ($$($DOCROOTPARENT_FLAG), )
-          # NOTE: Argument to -Xdocrootparent is not quoted to keep backwards compatibility.
-	  $$(call AddOption, -Xdocrootparent $(JAVADOC_BASE_URL))
-        endif
-        ifneq ($$($1_NO_COMMON_TAGS), TRUE)
-          # In order to get a specific ordering it's necessary to specify the total
-          # ordering of tags as the tags are otherwise ordered in order of definition.
-	  $$(call AddOption, -tag, beaninfo:X)
-	  $$(call AddOption, -tag, revised:X)
-	  $$(call AddOption, -tag, since.unbundled:X)
-	  $$(call AddOption, -tag, spec:X)
-	  $$(call AddOption, -tag, specdefault:X)
-	  $$(call AddOption, -tag, Note:X)
-	  $$(call AddOption, -tag, ToDo:X)
-	  $$(call AddOption, -tag, apiNote:a:API Note:)
-	  $$(call AddOption, -tag, implSpec:a:Implementation Requirements:)
-	  $$(call AddOption, -tag, implNote:a:Implementation Note:)
-	  $$(call AddOption, -tag, param)
-	  $$(call AddOption, -tag, return)
-	  $$(call AddOption, -tag, throws)
-	  $$(call AddOption, -tag, since)
-	  $$(call AddOption, -tag, version)
-	  $$(call AddOption, -tag, serialData)
-	  $$(call AddOption, -tag, factory)
-	  $$(call AddOption, -tag, see)
-	  $$(call AddOption, -tag, \
-              jvms:a:See <cite> The Java&trade; Virtual Machine Specification</cite>:)
-	  $$(call AddOption, -tag, \
-              jls:a:See <cite> The Java&trade; Language Specification</cite>:)
-        endif
-	$$(call AddOption, -Xdoclint:$$($1_DOCLINT))
-        ifneq ($$($1_DOCLINT_PACKAGES), )
-	  $$(call AddOption, -Xdoclint/package:$$(call CommaList, $$($1_DOCLINT_PACKAGES)))
-        endif
-	$$(call AddOption, --system, none)
-	$$(call AddOption, --module-source-path, $$(subst ",, $$(call PathList, $$(JAVADOC_SOURCE_DIRS))))
-	$$(call AddOption, --add-modules, $$(call CommaList, $$($1_MODULES)))
-	$$(call AddOption, -encoding, $$($1_ENCODING))
-        ifneq ($$($1_NODEPRECATEDLIST), )
-	  $$(call AddOption, -nodeprecatedlist)
-        endif
-        ifneq ($$($1_BREAKITERATOR), )
-	  $$(call AddOption, -breakiterator)
-        endif
-        ifneq ($$($1_SPLIT_INDEX), )
-	  $$(call AddOption, -splitIndex)
-        endif
-        ifneq ($$($1_OVERVIEW), )
-	  $$(call AddOption, -overview, $$($1_OVERVIEW))
-        endif
-	$$(call AddOption, -doctitle, $$($1_DOC_TITLE))
-	$$(call AddOption, -windowtitle, $$($1_WINDOW_TITLE) $$(DRAFT_WINTITLE))
-	$$(call AddOption, -header, $$($1_HEADER)$$(DRAFT_HEADER))
-        ifneq ($$($1_NOINDEX), )
-	  $$(call AddOption, -nonavbar)
-	  $$(call AddOption, -noindex)
-        endif
-        ifneq ($$($1_EXTRA_TOP_2), )
-	  $$(call AddOption, -top,$$($1_EXTRA_TOP_2))
-        endif
-	$$(call AddOption, -bottom, $$($1_BOTTOM)$$(DRAFT_BOTTOM))
-        ifneq ($$($1_PACKAGE_FILTER), )
-	  $$(call AddOption, -group, Packages, $$($1_PACKAGE_FILTER))
-        endif
-        ifneq ($$($1_RELATIVE_CORE_DIR), )
-	  $$(call AddOption, -linkoffline, $$($1_RELATIVE_CORE_DIR)/api, $$(JAVADOC_OUTPUTDIR)/api/)
-        endif
-        ifneq ($$($1_EXTRA_TOP), )
-	  $$(call AddOption, -top, $$($1_EXTRA_TOP))
-        endif
+  ifneq ($$($1_OVERVIEW), )
+    $1_OPTIONS += -overview $$($1_OVERVIEW)
+    $1_DEPS +=  $$($1_OVERVIEW)
+  endif
+
+  ifneq ($$($1_SPLIT_INDEX), )
+    $1_OPTIONS += -splitIndex
+  endif
+
+  ifneq ($$($DOCROOTPARENT_FLAG), )
+    $1_OPTIONS += -Xdocrootparent $(JAVADOC_BASE_URL)
+  endif
+
+  $1_VARDEPS := $$($1_OPTIONS) $$($1_PACKAGES)
+  $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
+       $$(SUPPORT_OUTPUTDIR)/docs/$1.vardeps)
 
   $1_PACKAGE_DEPS := $$(call CacheFind, $$(wildcard $$(foreach p, \
       $$(subst .,/,$$(strip $$($1_PACKAGES))), \
       $$(addsuffix /$$p, $$(wildcard $$(JAVADOC_SOURCE_DIRS))))))
 
+  # If there are many packages, use an @-file...
+  ifneq ($$(word 17, $$($1_PACKAGES)), )
+    $1_PACKAGES_FILE := $$(SUPPORT_OUTPUTDIR)/docs/$1.packages
+    $1_PACKAGES_ARG := @$$($1_PACKAGES_FILE)
+  else
+    $1_PACKAGES_ARG := $$($1_PACKAGES)
+  endif
+
+  # The index.html which is a marker for all the output from javadoc.
+  $1_INDEX_FILE := $$(JAVADOC_OUTPUTDIR)/$$($1_OUTPUT_DIRNAME)/index.html
+
   # Rule for actually running javadoc
-  $$($1_INDEX_FILE): $$($1_OPTIONS_FILE) $$($1_PACKAGES_FILE) \
-    $$($1_PACKAGE_DEPS) $$($1_DEPS)
-	$$(call LogWarn, Generating Javadoc for $$($1_OUTPUT_DIRNAME))
+  $$($1_INDEX_FILE): $$($1_VARDEPS_FILE) $$($1_PACKAGE_DEPS) $$($1_DEPS)
+	$$(call LogWarn, Generating Javadoc from $$(words $$($1_PACKAGES)) package(s) for $$($1_OUTPUT_DIRNAME))
 	$$(call MakeDir, $$(@D))
-        ifneq ($$(findstring $$(LOG_LEVEL), debug trace),)
-	  $$(ECHO) "Contents of $$($1_OPTIONS_FILE):" `$$(CAT) $$($1_OPTIONS_FILE)`
-	  $$(ECHO) "Contents of $$($1_PACKAGES_FILE):" `$$(CAT) $$($1_PACKAGES_FILE)`
+        ifneq ($$($1_PACKAGES_FILE), )
+	  $$(eval $$(call ListPathsSafely, $1_PACKAGES, $$($1_PACKAGES_FILE)))
         endif
 	$$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/docs/$1.javadoc, \
 	    $$($1_JAVA) -Djava.awt.headless=true $(NEW_JAVADOC) -d $$(@D) \
-	    @$$($1_OPTIONS_FILE) @$$($1_PACKAGES_FILE))
-	$$(TOUCH) $$($1_INDEX_FILE)
+	        $$(DEFAULT_JAVADOC_TAGS) $$(DEFAULT_JAVADOC_OPTIONS) \
+	        --module-source-path $$(call PathList, $$(JAVADOC_SOURCE_DIRS)) \
+	        $$($1_OPTIONS) $$($1_PACKAGES_ARG))
 
   # The output returned will be the index.html file
   $1 := $$($1_INDEX_FILE)
@@ -367,250 +325,22 @@
 
 ################################################################################
 
-CORE_PACKAGES := \
-    java.applet \
-    java.awt \
-    java.awt.color \
-    java.awt.datatransfer \
-    java.awt.desktop \
-    java.awt.dnd \
-    java.awt.event \
-    java.awt.font \
-    java.awt.geom \
-    java.awt.im \
-    java.awt.im.spi \
-    java.awt.image \
-    java.awt.image.renderable \
-    java.awt.print \
-    java.beans \
-    java.beans.beancontext \
-    java.io \
-    java.lang \
-    java.lang.annotation \
-    java.lang.instrument \
-    java.lang.invoke \
-    java.lang.management \
-    java.lang.module \
-    java.lang.ref \
-    java.lang.reflect \
-    java.math \
-    java.net \
-    java.net.http \
-    java.net.spi \
-    java.nio \
-    java.nio.channels \
-    java.nio.channels.spi \
-    java.nio.charset \
-    java.nio.charset.spi \
-    java.nio.file \
-    java.nio.file.attribute \
-    java.nio.file.spi \
-    java.rmi \
-    java.rmi.activation \
-    java.rmi.dgc \
-    java.rmi.registry \
-    java.rmi.server \
-    java.security \
-    java.security.acl \
-    java.security.cert \
-    java.security.interfaces \
-    java.security.spec \
-    java.sql \
-    java.text \
-    java.text.spi \
-    java.time \
-    java.time.chrono \
-    java.time.format \
-    java.time.temporal \
-    java.time.zone \
-    java.util \
-    java.util.concurrent \
-    java.util.concurrent.atomic \
-    java.util.concurrent.locks \
-    java.util.function \
-    java.util.jar \
-    java.util.logging \
-    java.util.prefs \
-    java.util.regex \
-    java.util.spi \
-    java.util.stream \
-    java.util.zip \
-    javax.accessibility \
-    javax.activation \
-    javax.activity \
-    javax.annotation \
-    javax.annotation.processing \
-    javax.crypto \
-    javax.crypto.interfaces \
-    javax.crypto.spec \
-    javax.imageio \
-    javax.imageio.event \
-    javax.imageio.metadata \
-    javax.imageio.plugins.jpeg \
-    javax.imageio.plugins.bmp \
-    javax.imageio.plugins.tiff \
-    javax.imageio.spi \
-    javax.imageio.stream \
-    javax.jws \
-    javax.jws.soap \
-    javax.lang.model \
-    javax.lang.model.element \
-    javax.lang.model.type \
-    javax.lang.model.util \
-    javax.management \
-    javax.management.loading \
-    javax.management.monitor \
-    javax.management.relation \
-    javax.management.openmbean \
-    javax.management.timer \
-    javax.management.modelmbean \
-    javax.management.remote \
-    javax.management.remote.rmi \
-    javax.naming \
-    javax.naming.directory \
-    javax.naming.event \
-    javax.naming.ldap \
-    javax.naming.spi \
-    javax.net \
-    javax.net.ssl \
-    javax.print \
-    javax.print.attribute \
-    javax.print.attribute.standard \
-    javax.print.event \
-    javax.rmi \
-    javax.rmi.CORBA \
-    javax.rmi.ssl \
-    javax.script \
-    javax.security.auth \
-    javax.security.auth.callback \
-    javax.security.auth.kerberos \
-    javax.security.auth.login \
-    javax.security.auth.spi \
-    javax.security.auth.x500 \
-    javax.security.cert \
-    javax.security.sasl \
-    javax.sound.sampled \
-    javax.sound.sampled.spi \
-    javax.sound.midi \
-    javax.sound.midi.spi \
-    javax.sql \
-    javax.sql.rowset \
-    javax.sql.rowset.serial \
-    javax.sql.rowset.spi \
-    javax.swing \
-    javax.swing.border \
-    javax.swing.colorchooser \
-    javax.swing.filechooser \
-    javax.swing.event \
-    javax.swing.table \
-    javax.swing.text \
-    javax.swing.text.html \
-    javax.swing.text.html.parser \
-    javax.swing.text.rtf \
-    javax.swing.tree \
-    javax.swing.undo \
-    javax.swing.plaf \
-    javax.swing.plaf.basic \
-    javax.swing.plaf.metal \
-    javax.swing.plaf.multi \
-    javax.swing.plaf.nimbus \
-    javax.swing.plaf.synth \
-    javax.tools \
-    javax.transaction \
-    javax.transaction.xa \
-    javax.xml.catalog \
-    javax.xml.parsers \
-    javax.xml.bind \
-    javax.xml.bind.annotation \
-    javax.xml.bind.annotation.adapters \
-    javax.xml.bind.attachment \
-    javax.xml.bind.helpers \
-    javax.xml.bind.util \
-    javax.xml.soap \
-    javax.xml.ws \
-    javax.xml.ws.handler \
-    javax.xml.ws.handler.soap \
-    javax.xml.ws.http \
-    javax.xml.ws.soap \
-    javax.xml.ws.spi \
-    javax.xml.ws.spi.http \
-    javax.xml.ws.wsaddressing \
-    javax.xml.transform \
-    javax.xml.transform.sax \
-    javax.xml.transform.dom \
-    javax.xml.transform.stax \
-    javax.xml.transform.stream \
-    javax.xml \
-    javax.xml.crypto \
-    javax.xml.crypto.dom \
-    javax.xml.crypto.dsig \
-    javax.xml.crypto.dsig.dom \
-    javax.xml.crypto.dsig.keyinfo \
-    javax.xml.crypto.dsig.spec \
-    javax.xml.datatype \
-    javax.xml.validation \
-    javax.xml.namespace \
-    javax.xml.xpath \
-    javax.xml.stream \
-    javax.xml.stream.events \
-    javax.xml.stream.util \
-    org.ietf.jgss \
-    org.omg.CORBA \
-    org.omg.CORBA.DynAnyPackage \
-    org.omg.CORBA.ORBPackage \
-    org.omg.CORBA.TypeCodePackage \
-    org.omg.stub.java.rmi \
-    org.omg.CORBA.portable \
-    org.omg.CORBA_2_3 \
-    org.omg.CORBA_2_3.portable \
-    org.omg.CosNaming \
-    org.omg.CosNaming.NamingContextExtPackage \
-    org.omg.CosNaming.NamingContextPackage \
-    org.omg.SendingContext \
-    org.omg.PortableServer \
-    org.omg.PortableServer.CurrentPackage \
-    org.omg.PortableServer.POAPackage \
-    org.omg.PortableServer.POAManagerPackage \
-    org.omg.PortableServer.ServantLocatorPackage \
-    org.omg.PortableServer.portable \
-    org.omg.PortableInterceptor \
-    org.omg.PortableInterceptor.ORBInitInfoPackage \
-    org.omg.Messaging \
-    org.omg.IOP \
-    org.omg.IOP.CodecFactoryPackage \
-    org.omg.IOP.CodecPackage \
-    org.omg.Dynamic \
-    org.omg.DynamicAny \
-    org.omg.DynamicAny.DynAnyPackage \
-    org.omg.DynamicAny.DynAnyFactoryPackage \
-    org.w3c.dom \
-    org.w3c.dom.events \
-    org.w3c.dom.bootstrap \
-    org.w3c.dom.ls \
-    org.w3c.dom.ranges \
-    org.w3c.dom.traversal \
-    org.w3c.dom.views \
-    org.xml.sax \
-    org.xml.sax.ext \
-    org.xml.sax.helpers
-
 $(eval $(call SetupJavadocGeneration, coredocs, \
     MODULES := java.se.ee, \
     PACKAGES := $(CORE_PACKAGES), \
     IS_CORE := TRUE, \
     OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html, \
     WINDOW_TITLE := Java Platform SE $(VERSION_SPECIFICATION), \
-    HEADER_TITLE := Java$(TRADEMARK)&nbsp;Platform<br>Standard&nbsp;Ed.&nbsp;$(VERSION_SPECIFICATION), \
-    DOC_TITLE := Java$(TRADEMARK) Platform$(COMMA) Standard Edition \
+    HEADER_TITLE := Java&trade;&nbsp;Platform<br>Standard&nbsp;Ed.&nbsp;$(VERSION_SPECIFICATION), \
+    DOC_TITLE := Java&trade; Platform$(COMMA) Standard Edition \
       $(VERSION_SPECIFICATION)<br>API Specification, \
     FIRST_COPYRIGHT_YEAR := 1993, \
-    DOCLINT := reference, \
+    DISABLED_DOCLINT := accessibility html missing syntax, \
     DOCLINT_PACKAGES := -org.omg.* jdk.internal.logging.*, \
-    ENCODING := ISO-8859-1, \
     SPLIT_INDEX := TRUE, \
     BOTTOM_COPYRIGHT_URL := $(CORE_BOTTOM_COPYRIGHT_URL), \
     BOTTOM_TEXT := $(CORE_BOTTOM_TEXT), \
-    EXTRA_TOP := $(CORE_TOP_EARLYACCESS), \
+    EXTRA_TOP := $(EARLYACCESS_TOP), \
 ))
 
 TARGETS += $(coredocs)
@@ -623,14 +353,10 @@
         jdk.javadoc.doclet \
         jdk.javadoc.doclet.taglet \
         jdk.javadoc.doclets, \
-    PACKAGE_FILTER := jdk.javadoc.doclet*, \
     API_ROOT := jdk, \
     DEST_DIR := javadoc/doclet, \
     TITLE := Doclet API, \
     FIRST_COPYRIGHT_YEAR := 1993, \
-    BREAKITERATOR := TRUE, \
-    BOTTOM_ADDRESS := $(COMMON_BOTTOM_ADDRESS), \
-    BOTTOM_TEXT := $(COMMON_BOTTOM_TEXT), \
 ))
 
 TARGETS += $(docletapi)
@@ -640,36 +366,23 @@
 $(eval $(call SetupJavadocGeneration, old-docletapi, \
     MODULES := jdk.javadoc, \
     PACKAGES := com.sun.javadoc, \
-    PACKAGE_FILTER := com.sun.javadoc, \
     API_ROOT := jdk, \
     DEST_DIR := javadoc/old/doclet, \
     TITLE := Doclet API, \
     FIRST_COPYRIGHT_YEAR := 1993, \
-    BREAKITERATOR := TRUE, \
-    BOTTOM_ADDRESS := $(COMMON_BOTTOM_ADDRESS), \
-    BOTTOM_TEXT := $(COMMON_BOTTOM_TEXT), \
 ))
 
 TARGETS += $(old-docletapi)
 
 ################################################################################
 
-# Specify a single class instead of a package
-TAGLET_PACKAGE_SINGLE_CLASS := com/sun/tools/doclets/Taglet.java
-TAGLET_PACKAGE_DIR := $(LANGTOOLS_TOPDIR)/src/jdk.javadoc/share/classes
-
 $(eval $(call SetupJavadocGeneration, tagletapi, \
     MODULES := jdk.javadoc, \
     PACKAGES := com.sun.tools.doclets, \
-    PACKAGES_SINGLE_CLASS := $(TAGLET_PACKAGE_DIR)/$(TAGLET_PACKAGE_SINGLE_CLASS), \
     API_ROOT := jdk, \
     DEST_DIR := javadoc/old/taglet, \
     TITLE := Taglet API, \
     FIRST_COPYRIGHT_YEAR := 1993, \
-    BREAKITERATOR := TRUE, \
-    NOINDEX := TRUE, \
-    BOTTOM_ADDRESS := $(COMMON_BOTTOM_ADDRESS), \
-    BOTTOM_TEXT := $(COMMON_BOTTOM_TEXT), \
 ))
 
 TARGETS += $(tagletapi)
@@ -691,15 +404,12 @@
         org.w3c.dom.css \
         org.w3c.dom.events \
         org.w3c.dom.views, \
-    PACKAGE_FILTER := org.w3c.dom*, \
     API_ROOT := jre, \
     DEST_DIR := plugin/dom, \
     TITLE := Common DOM API, \
     FIRST_COPYRIGHT_YEAR := 2005, \
-    DOCLINT := none, \
+    DISABLED_DOCLINT := accessibility html missing, \
     SPLIT_INDEX := TRUE, \
-    BOTTOM_ADDRESS := $(COMMON_BOTTOM_ADDRESS), \
-    BOTTOM_TEXT := $(COMMON_BOTTOM_TEXT), \
 ))
 
 TARGETS += $(domapi)
@@ -717,9 +427,10 @@
     API_ROOT := jdk, \
     DEST_DIR := jpda/jdi, \
     OVERVIEW := $(JDK_TOPDIR)/src/jdk.jdi/share/classes/jdi-overview.html, \
-    TITLE := Java$(TRADEMARK) Debug Interface, \
+    TITLE := Java&trade; Debug Interface, \
     FIRST_COPYRIGHT_YEAR := 1999, \
-    DOCLINT := none, \
+    DISABLED_DOCLINT := accessibility missing syntax, \
+    SPLIT_INDEX := TRUE, \
 ))
 
 TARGETS += $(jdi)
@@ -736,9 +447,9 @@
     API_ROOT := jre, \
     DEST_DIR := security/jaas/spec, \
     OVERVIEW := $(JDK_TOPDIR)/src/jdk.security.auth/share/classes/jaas-overview.html, \
-    TITLE := Java$(TRADEMARK) Authentication and Authorization Service, \
+    TITLE := Java&trade; Authentication and Authorization Service, \
     FIRST_COPYRIGHT_YEAR := 1998, \
-    DOCLINT := none, \
+    DISABLED_DOCLINT := missing, \
 ))
 
 TARGETS += $(jaas)
@@ -751,10 +462,8 @@
     API_ROOT := jre, \
     DEST_DIR := security/jgss/spec, \
     OVERVIEW := $(JDK_TOPDIR)/src/java.security.jgss/share/classes/jgss-overview.html, \
-    TITLE := Java$(TRADEMARK) GSS-API Utilities, \
+    TITLE := Java&trade; GSS-API Utilities, \
     FIRST_COPYRIGHT_YEAR := 2000, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
 ))
 
 TARGETS += $(jgss)
@@ -766,10 +475,8 @@
     PACKAGES := javax.smartcardio, \
     API_ROOT := jre, \
     DEST_DIR := security/smartcardio/spec, \
-    TITLE := Java$(TRADEMARK) Smart Card I/O, \
+    TITLE := Java&trade; Smart Card I/O, \
     FIRST_COPYRIGHT_YEAR := 2005, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
 ))
 
 TARGETS += $(smartcardio)
@@ -783,10 +490,9 @@
         com.sun.net.httpserver.spi, \
     API_ROOT := jre, \
     DEST_DIR := net/httpserver/spec, \
-    TITLE := Java$(TRADEMARK) HTTP Server, \
+    TITLE := Java&trade; HTTP Server, \
     FIRST_COPYRIGHT_YEAR := 2005, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
+    DISABLED_DOCLINT := accessibility missing syntax, \
 ))
 
 TARGETS += $(httpserver)
@@ -799,9 +505,7 @@
     API_ROOT := jre, \
     DEST_DIR := plugin/jsobject, \
     FIRST_COPYRIGHT_YEAR := 1993, \
-    TITLE := Java$(TRADEMARK) JSObject Doc, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
+    TITLE := Java&trade; JSObject Doc, \
 ))
 
 TARGETS += $(jsobject)
@@ -814,10 +518,9 @@
     API_ROOT := jre, \
     DEST_DIR := management/extension, \
     OVERVIEW := $(JDK_TOPDIR)/src/java.management/share/classes/mgmt-overview.html, \
-    TITLE := Monitoring and Management Interface for the Java$(TRADEMARK) Platform, \
+    TITLE := Monitoring and Management Interface for the Java&trade; Platform, \
     FIRST_COPYRIGHT_YEAR := 2003, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
+    DISABLED_DOCLINT := accessibility missing reference, \
 ))
 
 TARGETS += $(mgmt)
@@ -833,8 +536,7 @@
     DEST_DIR := attach/spec, \
     TITLE := Attach API, \
     FIRST_COPYRIGHT_YEAR := 2005, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
+    DISABLED_DOCLINT := reference, \
 ))
 
 TARGETS += $(attach)
@@ -848,15 +550,12 @@
     DEST_DIR := jconsole/spec, \
     TITLE := JConsole API, \
     FIRST_COPYRIGHT_YEAR := 2006, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
 ))
 
 TARGETS += $(jconsole)
 
 ################################################################################
 
-# NOTE: Need to override RELATIVE_CORE_DIR to be bug compatible with old code.
 $(eval $(call SetupJavadocGeneration, jshellapi, \
     MODULES := jdk.jshell, \
     PACKAGES := \
@@ -865,10 +564,8 @@
         jdk.jshell.execution, \
     API_ROOT := jdk, \
     DEST_DIR := jshell, \
-    RELATIVE_CORE_DIR := ../../../.., \
     OVERVIEW := $(LANGTOOLS_TOPDIR)/src/jdk.jshell/share/classes/jdk/jshell/overview.html, \
     TITLE := JShell API, \
-    HEADER_TITLE := JSHELL API, \
     FIRST_COPYRIGHT_YEAR := 2015, \
 ))
 
@@ -882,11 +579,11 @@
         com.sun.source.doctree \
         com.sun.source.tree \
         com.sun.source.util, \
-    PACKAGE_FILTER := com.sun.source.*, \
     API_ROOT := jdk, \
     DEST_DIR := javac/tree, \
     TITLE := Compiler Tree API, \
     FIRST_COPYRIGHT_YEAR := 2005, \
+    SPLIT_INDEX := TRUE, \
 ))
 
 TARGETS += $(treeapi)
@@ -898,11 +595,11 @@
     PACKAGES := \
         jdk.nashorn.api.scripting \
         jdk.nashorn.api.tree, \
-    PACKAGE_FILTER := jdk.nashorn.api.*, \
     API_ROOT := jdk, \
     DEST_DIR := nashorn, \
     TITLE := Nashorn API, \
     FIRST_COPYRIGHT_YEAR := 2014, \
+    SPLIT_INDEX := TRUE, \
 ))
 
 TARGETS += $(nashornapi)
@@ -934,8 +631,6 @@
     DEST_DIR := nio/sctp/spec, \
     TITLE := SCTP API, \
     FIRST_COPYRIGHT_YEAR := 2009, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
 ))
 
 TARGETS += $(sctp)
@@ -949,7 +644,6 @@
     DEST_DIR := accessibility/jaccess/spec, \
     TITLE := JACCESS API, \
     FIRST_COPYRIGHT_YEAR := 2002, \
-    NODEPRECATEDLIST := TRUE, \
 ))
 
 TARGETS += $(jaccess)
@@ -963,8 +657,7 @@
     DEST_DIR := net/socketoptions/spec, \
     TITLE := jdk.net API, \
     FIRST_COPYRIGHT_YEAR := 2014, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
+    DISABLED_DOCLINT := missing, \
 ))
 
 TARGETS += $(jdknet)
@@ -980,8 +673,7 @@
     DEST_DIR := jlink, \
     TITLE := JLink Plugin API - EXPERIMENTAL, \
     FIRST_COPYRIGHT_YEAR := 2015, \
-    DOCLINT := none, \
-    NODEPRECATEDLIST := TRUE, \
+    DISABLED_DOCLINT := html missing syntax, \
 ))
 
 TARGETS += $(jlinkplugins)
@@ -1014,19 +706,13 @@
 
 ################################################################################
 # Optional target which bundles all generated javadocs into a zip archive.
-# The dependency on docs is handled in Main.gmk.
-
-# Add the core docs as prerequisite to the archive to trigger a rebuild
-# if the core docs were rebuilt. Ideally any doc rebuild should trigger
-# this, but the way prerequisites are currently setup in this file, that
-# is hard to achieve.
 
 JAVADOC_ARCHIVE_NAME := jdk-$(VERSION_STRING)-docs.zip
 JAVADOC_ARCHIVE_ASSEMBLY_DIR := $(SUPPORT_OUTPUTDIR)/docs/zip-docs
 JAVADOC_ARCHIVE_DIR := $(OUTPUT_ROOT)/bundles
 JAVADOC_ARCHIVE := $(JAVADOC_ARCHIVE_DIR)/$(JAVADOC_ARCHIVE_NAME)
 
-$(JAVADOC_ARCHIVE): $(CORE_INDEX_FILE)
+$(JAVADOC_ARCHIVE): $(TARGETS) $(COPY_TARGETS)
 	$(call LogInfo, Compressing javadoc to single $(JAVADOC_ARCHIVE_NAME))
 	$(MKDIR) -p $(JAVADOC_ARCHIVE_DIR)
 	$(RM) -r $(JAVADOC_ARCHIVE_ASSEMBLY_DIR)
@@ -1038,7 +724,7 @@
 	  name=`$(ECHO) $${target_dir} | $(SED) "s;/spec;;" | $(SED) "s;.*/;;"`; \
 	  $(LN) -s $${target_dir}  $${name}; \
 	done; \
-	$(ZIP) -q -r $(JAVADOC_ARCHIVE) * ; \
+	$(ZIPEXE) -q -r $(JAVADOC_ARCHIVE) * ; \
 	popd ;
 
 ZIP_TARGETS += $(JAVADOC_ARCHIVE)
--- a/make/Jprt.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/Jprt.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -71,11 +71,11 @@
   # This target must be called in the context of a SPEC file
   $(JPRT_ARCHIVE_BUNDLE): product-images
 	$(call MakeDir, $(@D))
-	$(CD) $(SRC_JDK_IMAGE_DIR) && $(ZIP) -y -q -r $@ .
+	$(CD) $(SRC_JDK_IMAGE_DIR) && $(ZIPEXE) -y -q -r $@ .
 
   $(JPRT_ARCHIVE_TEST_BUNDLE): test-image
 	$(call MakeDir, $(@D))
-	$(CD) $(SRC_TEST_IMAGE_DIR) && $(ZIP) -y -q -r $@ .
+	$(CD) $(SRC_TEST_IMAGE_DIR) && $(ZIPEXE) -y -q -r $@ .
 
   ##############################################################################
   # Optional symbols bundle
@@ -85,7 +85,7 @@
 
     $(JPRT_ARCHIVE_SYMBOLS_BUNDLE): product-images
 	$(call MakeDir, $(@D))
-	$(CD) $(SYMBOLS_IMAGE_DIR) && $(ZIP) -y -q -r $@ .
+	$(CD) $(SYMBOLS_IMAGE_DIR) && $(ZIPEXE) -y -q -r $@ .
 
   endif
 
--- a/make/common/CORE_PKGS.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,305 +0,0 @@
-#
-# Copyright (c) 2001, 2016, 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.
-#
-
-# EXCLUDE_PKGS is the list of packages to exclude from the
-# Java API Specification. Do not add these to CORE_PKGS.
-# The concatenation of EXCLUDE_PKGS and CORE_PKGS
-# should make up the list of all packages under the
-# src/shared/classes directory of the JDK source tree.
-#
-EXCLUDE_PKGS = \
-    java.awt.peer \
-    java.awt.dnd.peer \
-    sun.* \
-    com.sun.* \
-    org.apache.* \
-    org.jcp.* \
-    org.w3c.dom.css \
-    org.w3c.dom.html \
-    org.w3c.dom.stylesheets \
-    org.omg.stub.javax.management.remote.rmi
-
-#
-# ACTIVE_JSR_PKGS are packages that are part of an active JSR process--
-# one that is doing its own review. These packages are not included when
-# creating diff pages for the platform's JCP process.
-#
-# (see /java/pubs/apisrc/jdk/6.0/beta/make/docs/active_jsr_pkgs)
-# Note:
-# This is a list of regular expressions. So foo.* matches "foo" and "foo.bar".
-#
-ACTIVE_JSR_PKGS= \
-    java.lang.invoke \
-    java.sql \
-    javax.activation \
-    javax.annotation.* \
-    javax.jws.* \
-    javax.lang.* \
-    javax.management.* \
-    javax.script \
-    javax.sql.* \
-    javax.tools.* \
-    javax.xml.* \
-    org.w3c.* \
-    org.xml.sax
-
-#
-# CORE_PKGS is the list of packages that form the
-# Java API Specification.
-#
-### ***IMPORTANT NOTE***
-### There is also a "REGEXP" variable in the docs/makefile that
-### determines which table the packages go in on the main page.
-### Currently, there is only table ("Platform Packages") and
-### everything goes in it, so REGEXP is "*". But if that policy
-### changes, packages added will need to be reflected in that
-### list of wildcard expressions, as well.
-###
-CORE_PKGS = \
-    java.applet \
-    java.awt \
-    java.awt.color \
-    java.awt.datatransfer \
-    java.awt.desktop \
-    java.awt.dnd \
-    java.awt.event \
-    java.awt.font \
-    java.awt.geom \
-    java.awt.im \
-    java.awt.im.spi \
-    java.awt.image \
-    java.awt.image.renderable \
-    java.awt.print \
-    java.beans \
-    java.beans.beancontext \
-    java.io \
-    java.lang \
-    java.lang.annotation \
-    java.lang.instrument \
-    java.lang.invoke \
-    java.lang.management \
-    java.lang.module \
-    java.lang.ref \
-    java.lang.reflect \
-    java.math \
-    java.net \
-    java.net.http \
-    java.net.spi \
-    java.nio \
-    java.nio.channels \
-    java.nio.channels.spi \
-    java.nio.charset \
-    java.nio.charset.spi \
-    java.nio.file \
-    java.nio.file.attribute \
-    java.nio.file.spi \
-    java.rmi \
-    java.rmi.activation \
-    java.rmi.dgc \
-    java.rmi.registry \
-    java.rmi.server \
-    java.security \
-    java.security.acl \
-    java.security.cert \
-    java.security.interfaces \
-    java.security.spec \
-    java.sql \
-    java.text \
-    java.text.spi \
-    java.time \
-    java.time.chrono \
-    java.time.format \
-    java.time.temporal \
-    java.time.zone \
-    java.util \
-    java.util.concurrent \
-    java.util.concurrent.atomic \
-    java.util.concurrent.locks \
-    java.util.function \
-    java.util.jar \
-    java.util.logging \
-    java.util.prefs \
-    java.util.regex \
-    java.util.spi \
-    java.util.stream \
-    java.util.zip \
-    javax.accessibility \
-    javax.activation \
-    javax.activity \
-    javax.annotation \
-    javax.annotation.processing \
-    javax.crypto \
-    javax.crypto.interfaces \
-    javax.crypto.spec \
-    javax.imageio \
-    javax.imageio.event \
-    javax.imageio.metadata \
-    javax.imageio.plugins.jpeg \
-    javax.imageio.plugins.bmp \
-    javax.imageio.plugins.tiff \
-    javax.imageio.spi \
-    javax.imageio.stream \
-    javax.jws \
-    javax.jws.soap \
-    javax.lang.model \
-    javax.lang.model.element \
-    javax.lang.model.type \
-    javax.lang.model.util \
-    javax.management \
-    javax.management.loading \
-    javax.management.monitor \
-    javax.management.relation \
-    javax.management.openmbean \
-    javax.management.timer \
-    javax.management.modelmbean \
-    javax.management.remote \
-    javax.management.remote.rmi \
-    javax.naming \
-    javax.naming.directory \
-    javax.naming.event \
-    javax.naming.ldap \
-    javax.naming.spi \
-    javax.net \
-    javax.net.ssl \
-    javax.print \
-    javax.print.attribute \
-    javax.print.attribute.standard \
-    javax.print.event \
-    javax.rmi \
-    javax.rmi.CORBA \
-    javax.rmi.ssl \
-    javax.script \
-    javax.security.auth \
-    javax.security.auth.callback \
-    javax.security.auth.kerberos \
-    javax.security.auth.login \
-    javax.security.auth.spi \
-    javax.security.auth.x500 \
-    javax.security.cert \
-    javax.security.sasl \
-    javax.sound.sampled \
-    javax.sound.sampled.spi \
-    javax.sound.midi \
-    javax.sound.midi.spi \
-    javax.sql \
-    javax.sql.rowset \
-    javax.sql.rowset.serial \
-    javax.sql.rowset.spi \
-    javax.swing \
-    javax.swing.border \
-    javax.swing.colorchooser \
-    javax.swing.filechooser \
-    javax.swing.event \
-    javax.swing.table \
-    javax.swing.text \
-    javax.swing.text.html \
-    javax.swing.text.html.parser \
-    javax.swing.text.rtf \
-    javax.swing.tree \
-    javax.swing.undo \
-    javax.swing.plaf \
-    javax.swing.plaf.basic \
-    javax.swing.plaf.metal \
-    javax.swing.plaf.multi \
-    javax.swing.plaf.nimbus \
-    javax.swing.plaf.synth \
-    javax.tools \
-    javax.transaction \
-    javax.transaction.xa \
-    javax.xml.catalog \
-    javax.xml.parsers \
-    javax.xml.bind \
-    javax.xml.bind.annotation \
-    javax.xml.bind.annotation.adapters \
-    javax.xml.bind.attachment \
-    javax.xml.bind.helpers \
-    javax.xml.bind.util \
-    javax.xml.soap \
-    javax.xml.ws \
-    javax.xml.ws.handler \
-    javax.xml.ws.handler.soap \
-    javax.xml.ws.http \
-    javax.xml.ws.soap \
-    javax.xml.ws.spi \
-    javax.xml.ws.spi.http \
-    javax.xml.ws.wsaddressing \
-    javax.xml.transform \
-    javax.xml.transform.sax \
-    javax.xml.transform.dom \
-    javax.xml.transform.stax \
-    javax.xml.transform.stream \
-    javax.xml \
-    javax.xml.crypto \
-    javax.xml.crypto.dom \
-    javax.xml.crypto.dsig \
-    javax.xml.crypto.dsig.dom \
-    javax.xml.crypto.dsig.keyinfo \
-    javax.xml.crypto.dsig.spec \
-    javax.xml.datatype \
-    javax.xml.validation \
-    javax.xml.namespace \
-    javax.xml.xpath \
-    javax.xml.stream \
-    javax.xml.stream.events \
-    javax.xml.stream.util \
-    org.ietf.jgss \
-    org.omg.CORBA \
-    org.omg.CORBA.DynAnyPackage \
-    org.omg.CORBA.ORBPackage \
-    org.omg.CORBA.TypeCodePackage \
-    org.omg.stub.java.rmi \
-    org.omg.CORBA.portable \
-    org.omg.CORBA_2_3 \
-    org.omg.CORBA_2_3.portable \
-    org.omg.CosNaming \
-    org.omg.CosNaming.NamingContextExtPackage \
-    org.omg.CosNaming.NamingContextPackage \
-    org.omg.SendingContext \
-    org.omg.PortableServer \
-    org.omg.PortableServer.CurrentPackage \
-    org.omg.PortableServer.POAPackage \
-    org.omg.PortableServer.POAManagerPackage \
-    org.omg.PortableServer.ServantLocatorPackage \
-    org.omg.PortableServer.portable \
-    org.omg.PortableInterceptor \
-    org.omg.PortableInterceptor.ORBInitInfoPackage \
-    org.omg.Messaging \
-    org.omg.IOP \
-    org.omg.IOP.CodecFactoryPackage \
-    org.omg.IOP.CodecPackage \
-    org.omg.Dynamic \
-    org.omg.DynamicAny \
-    org.omg.DynamicAny.DynAnyPackage \
-    org.omg.DynamicAny.DynAnyFactoryPackage \
-    org.w3c.dom \
-    org.w3c.dom.events \
-    org.w3c.dom.bootstrap \
-    org.w3c.dom.ls \
-    org.w3c.dom.ranges \
-    org.w3c.dom.traversal \
-    org.w3c.dom.views \
-    org.xml.sax \
-    org.xml.sax.ext \
-    org.xml.sax.helpers
--- a/make/common/JarArchive.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/common/JarArchive.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -264,7 +264,7 @@
 	  $(CAT) $$($1_DELETES_FILE) > $$($1_DELETESS_FILE) $$(NEWLINE) \
 	  if [ -s $$($1_DELETESS_FILE) ]; then \
 	    $(ECHO) "  deleting" `$(WC) -l $$($1_DELETESS_FILE) | $(AWK) '{ print $$$$1 }'` files && \
-	    $(ZIP) -q -d $$@ `$(CAT) $$($1_DELETESS_FILE)` ; \
+	    $(ZIPEXE) -q -d $$@ `$(CAT) $$($1_DELETESS_FILE)` ; \
 	  fi $$(NEWLINE) \
 	  $$($1_UPDATE_CONTENTS) true $$(NEWLINE) \
 	  $$($1_JARINDEX) && true )
--- a/make/common/MakeBase.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/common/MakeBase.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -122,6 +122,10 @@
 EscapeDollar = $(subst $$,\$$,$(subst \$$,$$,$(strip $1)))
 
 ################################################################################
+# This macro works just like EscapeDollar above, but for #.
+EscapeHash = $(subst \#,\\\#,$(subst \\\#,\#,$(strip $1)))
+
+################################################################################
 # This macro translates $ into $$ to protect the string from make itself.
 DoubleDollar = $(subst $$,$$$$,$(strip $1))
 
@@ -833,7 +837,7 @@
           $(if $(findstring $(LOG_LEVEL), trace), \
               $(info NewVariable $1: >$(strip $($1))<) \
               $(info OldVariable $1: >$(strip $($1_old))<)) \
-          $(call WriteFile, $1_old:=$(call DoubleDollar,$($1)), \
+          $(call WriteFile, $1_old:=$(call DoubleDollar,$(call EscapeHash,$($1))), \
               $(call DependOnVariableFileName, $1, $2))) \
         $(call DependOnVariableFileName, $1, $2) \
     )
--- a/make/common/NON_CORE_PKGS.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-#
-# Copyright (c) 2002, 2016, 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.
-#
-
-#
-# This file contains the package names of all the "non-core"
-# API published in the Java 2 SDK documentation. "Non-core" means
-# it includes all published API outside of the JDK API specification.
-#
-# These environment variables are used by javadoc in
-# make/docs/Makefile and are referenced by the localization
-# team when determining which APIs to extract javadoc
-# comments from.
-
-DOMAPI_PKGS = org.w3c.dom \
-    org.w3c.dom.bootstrap \
-    org.w3c.dom.ls \
-    org.w3c.dom.ranges \
-    org.w3c.dom.traversal \
-    org.w3c.dom.html \
-    org.w3c.dom.stylesheets \
-    org.w3c.dom.css \
-    org.w3c.dom.events \
-    org.w3c.dom.views
-
-JDI_PKGS = com.sun.jdi \
-    com.sun.jdi.event \
-    com.sun.jdi.request \
-    com.sun.jdi.connect \
-    com.sun.jdi.connect.spi
-
-MGMT_PKGS = com.sun.management
-
-JAAS_PKGS = com.sun.security.auth \
-    com.sun.security.auth.callback \
-    com.sun.security.auth.login \
-    com.sun.security.auth.module
-
-JGSS_PKGS = com.sun.security.jgss
-
-OLD_JSSE_PKGS = com.sun.net.ssl
-
-HTTPSERVER_PKGS = com.sun.net.httpserver \
-    com.sun.net.httpserver.spi
-
-NIO_PKGS = com.sun.nio.file
-
-OLD_DOCLETAPI_PKGS = com.sun.javadoc
-
-DOCLETAPI_PKGS = jdk.javadoc.doclet \
-    jdk.javadoc.doclet.taglet \
-    jdk.javadoc.doclets
-
-TAGLETAPI_FILE = com/sun/tools/doclets/Taglet.java
-
-TAGLETAPI_PKGS = com.sun.tools.doclets
-
-ATTACH_PKGS = com.sun.tools.attach \
-    com.sun.tools.attach.spi
-
-JCONSOLE_PKGS = com.sun.tools.jconsole
-
-JSHELLAPI_PKGS = jdk.jshell \
-    jdk.jshell.spi \
-    jdk.jshell.execution
-
-TREEAPI_PKGS = com.sun.source.doctree \
-    com.sun.source.tree \
-    com.sun.source.util
-
-NASHORNAPI_PKGS = jdk.nashorn.api.scripting \
-    jdk.nashorn.api.tree
-   
-DYNALINKAPI_PKGS = jdk.dynalink \
-    jdk.dynalink.beans \
-    jdk.dynalink.linker \
-    jdk.dynalink.linker.support \
-    jdk.dynalink.support
-
-SMARTCARDIO_PKGS = javax.smartcardio
-
-SCTPAPI_PKGS = com.sun.nio.sctp
-
-ifeq ($(PLATFORM), macosx)
-  APPLE_EXT_PKGS = com.apple.eawt \
-      com.apple.eawt.event \
-      com.apple.eio
-endif
-
-JDK_PKGS = jdk \
-      jdk.net \
-      jdk.management.cmm
-
-JACCESSAPI_PKGS = com.sun.java.accessibility.util
-
-JSOBJECT_PKGS = netscape.javascript
-
-# non-core packages in rt.jar
-NON_CORE_PKGS = $(DOMAPI_PKGS) \
-    $(JSOBJECT_PKGS) \
-    $(MGMT_PKGS) \
-    $(JAAS_PKGS) \
-    $(JGSS_PKGS) \
-    $(NIO_PKGS) \
-    $(OLD_JSSE_PKGS) \
-    $(HTTPSERVER_PKGS) \
-    $(SMARTCARDIO_PKGS) \
-    $(SCTPAPI_PKGS) \
-    $(APPLE_EXT_PKGS) \
-    $(JDK_PKGS) \
-    $(JACCESSAPI_PKGS)
--- a/make/common/NativeCompilation.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/common/NativeCompilation.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -875,7 +875,7 @@
           # to be rebuilt properly.
           $$($1_DEBUGINFO_ZIP): $$($1_DEBUGINFO_FILES) $$($1_TARGET)
 		$(CD) $$($1_OUTPUT_DIR) && \
-		    $(ZIP) -q -r $$@ $$(subst $$($1_OUTPUT_DIR)/,, $$($1_DEBUGINFO_FILES))
+		    $(ZIPEXE) -q -r $$@ $$(subst $$($1_OUTPUT_DIR)/,, $$($1_DEBUGINFO_FILES))
 
         endif
        endif # !STATIC_LIBRARY
--- a/make/common/ZipArchive.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/common/ZipArchive.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -107,7 +107,7 @@
   $$($1_ZIP) : $$($1_ALL_SRCS) $$($1_EXTRA_DEPS)
 	$(MKDIR) -p $$(@D)
 	$(ECHO) Updating $$($1_NAME)
-	$$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$($1_ZIP_OPTIONS) $$@ . $$($1_ZIP_INCLUDES) \
+	$$(foreach i,$$($1_SRC),(cd $$i && $(ZIPEXE) -qru $$($1_ZIP_OPTIONS) $$@ . $$($1_ZIP_INCLUDES) \
 	    $$($1_ZIP_EXCLUDES) -x \*_the.\* \
 	    $$(addprefix -x$(SPACE), $$(patsubst $$i/%,%, $$($1_EXCLUDE_FILES))) \
 	    || test "$$$$?" = "12" )$$(NEWLINE)) true
--- a/make/jprt.properties	Wed Nov 16 14:27:23 2016 -0800
+++ b/make/jprt.properties	Tue Nov 22 11:45:55 2016 -0800
@@ -334,11 +334,7 @@
     solaris_sparcv9_5.11-{product|fastdebug}-c2-jvm98,			\
     solaris_sparcv9_5.11-{product|fastdebug}-c2-jvm98_nontiered,	\
     solaris_sparcv9_5.11-{product|fastdebug}-c2-scimark,		\
-    solaris_sparcv9_5.11-product-c2-runThese8,				\
-    solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_SerialGC,	\
-    solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_ParallelGC,	\
-    solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_CMS,		\
-    solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_G1
+    solaris_sparcv9_5.11-product-c2-runThese8,
 
 my.test.targets.hotspot.solaris.x64=					\
     solaris_x64_5.11-{product|fastdebug}-c2-jvm98,			\
@@ -346,40 +342,24 @@
     solaris_x64_5.11-{product|fastdebug}-c2-scimark,			\
     solaris_x64_5.11-product-c2-runThese8,				\
     solaris_x64_5.11-product-c2-runThese8_Xcomp_lang,			\
-    solaris_x64_5.11-product-c2-runThese8_Xcomp_vm,			\
-    solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_SerialGC,		\
-    solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_ParallelGC,	\
-    solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_CMS,		\
-    solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_G1
+    solaris_x64_5.11-product-c2-runThese8_Xcomp_vm,
 
 my.test.targets.hotspot.linux.i586=					\
     linux_i586_3.8-{product|fastdebug}-c2-jvm98,			\
     linux_i586_3.8-{product|fastdebug}-c2-jvm98_nontiered,		\
     linux_i586_3.8-{product|fastdebug}-c2-scimark,			\
     linux_i586_3.8-fastdebug-c2-runThese8_Xcomp_lang,			\
-    linux_i586_3.8-fastdebug-c2-runThese8_Xcomp_vm,			\
-    linux_i586_3.8-{product|fastdebug}-c2-GCBasher_SerialGC,		\
-    linux_i586_3.8-{product|fastdebug}-c2-GCBasher_ParallelGC,		\
-    linux_i586_3.8-{product|fastdebug}-c2-GCBasher_CMS,			\
-    linux_i586_3.8-{product|fastdebug}-c2-GCBasher_G1
+    linux_i586_3.8-fastdebug-c2-runThese8_Xcomp_vm
 
 my.test.targets.hotspot.linux.x64=					\
     linux_x64_3.8-{product|fastdebug}-c2-jvm98,				\
     linux_x64_3.8-{product|fastdebug}-c2-jvm98_nontiered,		\
-    linux_x64_3.8-{product|fastdebug}-c2-scimark,			\
-    linux_x64_3.8-{product|fastdebug}-c2-GCBasher_SerialGC,		\
-    linux_x64_3.8-{product|fastdebug}-c2-GCBasher_ParallelGC,		\
-    linux_x64_3.8-{product|fastdebug}-c2-GCBasher_CMS,			\
-    linux_x64_3.8-{product|fastdebug}-c2-GCBasher_G1
+    linux_x64_3.8-{product|fastdebug}-c2-scimark
 
 my.test.targets.hotspot.macosx.x64=					\
     macosx_x64_10.9-{product|fastdebug}-c2-jvm98,			\
     macosx_x64_10.9-{product|fastdebug}-c2-jvm98_nontiered,		\
-    macosx_x64_10.9-{product|fastdebug}-c2-scimark,			\
-    macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_SerialGC,		\
-    macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_ParallelGC,		\
-    macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_CMS,		\
-    macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_G1
+    macosx_x64_10.9-{product|fastdebug}-c2-scimark
 
 my.test.targets.hotspot.windows.i586=					\
     windows_i586_6.3-{product|fastdebug}-c2-jvm98,			\
@@ -387,11 +367,7 @@
     windows_i586_6.3-{product|fastdebug}-c2-scimark,			\
     windows_i586_6.3-product-c2-runThese8,				\
     windows_i586_6.3-product-c2-runThese8_Xcomp_lang,			\
-    windows_i586_6.3-product-c2-runThese8_Xcomp_vm,			\
-    windows_i586_6.3-{product|fastdebug}-c2-GCBasher_SerialGC,		\
-    windows_i586_6.3-{product|fastdebug}-c2-GCBasher_ParallelGC,	\
-    windows_i586_6.3-{product|fastdebug}-c2-GCBasher_CMS,		\
-    windows_i586_6.3-{product|fastdebug}-c2-GCBasher_G1
+    windows_i586_6.3-product-c2-runThese8_Xcomp_vm,
 
 my.test.targets.hotspot.windows.x64=					\
     windows_x64_6.3-{product|fastdebug}-c2-jvm98,			\
@@ -399,11 +375,7 @@
     windows_x64_6.3-{product|fastdebug}-c2-scimark,			\
     windows_x64_6.3-product-c2-runThese8,				\
     windows_x64_6.3-product-c2-runThese8_Xcomp_lang,			\
-    windows_x64_6.3-product-c2-runThese8_Xcomp_vm,			\
-    windows_x64_6.3-{product|fastdebug}-c2-GCBasher_SerialGC,		\
-    windows_x64_6.3-{product|fastdebug}-c2-GCBasher_ParallelGC,		\
-    windows_x64_6.3-{product|fastdebug}-c2-GCBasher_CMS,		\
-    windows_x64_6.3-{product|fastdebug}-c2-GCBasher_G1
+    windows_x64_6.3-product-c2-runThese8_Xcomp_vm,
 
 # Some basic "smoke" tests for OpenJDK builds
 my.test.targets.hotspot.open=						\
@@ -468,9 +440,17 @@
   ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_fast_gc_2},		\
   ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_fast_gc_closed},		\
   ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_fast_gc_gcold},		\
+  ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_fast_gc_gcbasher},	\
   ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_fast_runtime},		\
   ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_fast_serviceability},	\
   ${my.make.rule.test.targets.hotspot.reg.group:GROUP=jdk_svc_sanity},			\
+  solaris_sparcv9_5.11-product-c2-hotspot_fast_gc_gcbasher,				\
+  solaris_x64_5.11-product-c2-hotspot_fast_gc_gcbasher,					\
+  linux_i586_3.8-product-c2-hotspot_fast_gc_gcbasher,					\
+  linux_x64_3.8-product-c2-hotspot_fast_gc_gcbasher,					\
+  macosx_x64_10.9-product-c2-hotspot_fast_gc_gcbasher,					\
+  windows_i586_6.3-product-c2-hotspot_fast_gc_gcbasher,					\
+  windows_x64_6.3-product-c2-hotspot_fast_gc_gcbasher,                                  \
   ${my.additional.make.rule.test.targets.hotspot.reg}
 
 # Other Makefile based Hotspot tests
--- a/nashorn/.hgtags	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/.hgtags	Tue Nov 22 11:45:55 2016 -0800
@@ -377,3 +377,4 @@
 a46b7d3867957a868a6cc8ee66c05079b883733a jdk-9+141
 d3f5d7311a1aec3152b17d75046d5d298245a0b4 jdk-9+142
 b4e57ead3fae4939b70dd345d1f6744a1dedfa21 jdk-9+143
+a7f21ee6ed30695a6de14e74035d2857a754f62b jdk-9+144
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java	Tue Nov 22 11:45:55 2016 -0800
@@ -384,7 +384,7 @@
         final List<CatchTreeImpl> catchTrees = new ArrayList<>(catchNodes.size());
         for (final CatchNode catchNode : catchNodes) {
             catchTrees.add(new CatchTreeImpl(catchNode,
-                    translateIdent(catchNode.getException()),
+                    translateExpr(catchNode.getException()),
                     (BlockTree) translateBlock(catchNode.getBody()),
                     translateExpr(catchNode.getExceptionCondition())));
         }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java	Tue Nov 22 11:45:55 2016 -0800
@@ -462,7 +462,7 @@
 
     @Override
     public boolean enterCatchNode(final CatchNode catchNode) {
-        final IdentNode exception = catchNode.getException();
+        final IdentNode exception = catchNode.getExceptionIdentifier();
         final Block     block     = lc.getCurrentBlock();
 
         start(catchNode);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java	Tue Nov 22 11:45:55 2016 -0800
@@ -3255,7 +3255,7 @@
             enterBlock(catchBlock);
 
             final CatchNode  catchNode          = (CatchNode)catchBlocks.get(i).getStatements().get(0);
-            final IdentNode  exception          = catchNode.getException();
+            final IdentNode  exception          = catchNode.getExceptionIdentifier();
             final Expression exceptionCondition = catchNode.getExceptionCondition();
             final Block      catchBody          = catchNode.getBody();
 
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java	Tue Nov 22 11:45:55 2016 -0800
@@ -33,6 +33,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Deque;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
@@ -122,9 +123,9 @@
         private final List<JumpOrigin> origins = new LinkedList<>();
         private Map<Symbol, LvarType> types = Collections.emptyMap();
 
-        void addOrigin(final JoinPredecessor originNode, final Map<Symbol, LvarType> originTypes) {
+        void addOrigin(final JoinPredecessor originNode, final Map<Symbol, LvarType> originTypes, final LocalVariableTypesCalculator calc) {
             origins.add(new JumpOrigin(originNode, originTypes));
-            this.types = getUnionTypes(this.types, originTypes);
+            this.types = calc.getUnionTypes(this.types, originTypes);
         }
     }
     private enum LvarType {
@@ -185,12 +186,15 @@
     }
 
     @SuppressWarnings("unchecked")
-    private static IdentityHashMap<Symbol, LvarType> cloneMap(final Map<Symbol, LvarType> map) {
-        return (IdentityHashMap<Symbol, LvarType>)((IdentityHashMap<?,?>)map).clone();
+    private static HashMap<Symbol, LvarType> cloneMap(final Map<Symbol, LvarType> map) {
+        return (HashMap<Symbol, LvarType>)((HashMap<?,?>)map).clone();
     }
 
     private LocalVariableConversion createConversion(final Symbol symbol, final LvarType branchLvarType,
             final Map<Symbol, LvarType> joinLvarTypes, final LocalVariableConversion next) {
+        if (invalidatedSymbols.contains(symbol)) {
+            return next;
+        }
         final LvarType targetType = joinLvarTypes.get(symbol);
         assert targetType != null;
         if(targetType == branchLvarType) {
@@ -208,7 +212,7 @@
         return new LocalVariableConversion(symbol, branchLvarType.type, targetType.type, next);
     }
 
-    private static Map<Symbol, LvarType> getUnionTypes(final Map<Symbol, LvarType> types1, final Map<Symbol, LvarType> types2) {
+    private Map<Symbol, LvarType> getUnionTypes(final Map<Symbol, LvarType> types1, final Map<Symbol, LvarType> types2) {
         if(types1 == types2 || types1.isEmpty()) {
             return types2;
         } else if(types2.isEmpty()) {
@@ -261,6 +265,11 @@
             final LvarType type2 = types2.get(symbol);
             union.put(symbol, widestLvarType(type1,  type2));
         }
+        // If the two sets of symbols differ, there's a good chance that some of
+        // symbols only appearing in one of the sets are lexically invalidated,
+        // so we remove them from further consideration.
+        // This is not strictly necessary, just a working set size optimization.
+        union.keySet().removeAll(invalidatedSymbols);
         return union;
     }
 
@@ -359,8 +368,6 @@
         if(t1.ordinal() < LvarType.INT.ordinal() || t2.ordinal() < LvarType.INT.ordinal()) {
             return LvarType.OBJECT;
         }
-        // NOTE: we allow "widening" of long to double even though it can lose precision. ECMAScript doesn't have an
-        // Int64 type anyway, so this loss of precision is actually more conformant to the specification...
         return LvarType.values()[Math.max(t1.ordinal(), t2.ordinal())];
     }
     private final Compiler compiler;
@@ -368,7 +375,10 @@
     // Local variable type mapping at the currently evaluated point. No map instance is ever modified; setLvarType() always
     // allocates a new map. Immutability of maps allows for cheap snapshots by just keeping the reference to the current
     // value.
-    private Map<Symbol, LvarType> localVariableTypes = new IdentityHashMap<>();
+    private Map<Symbol, LvarType> localVariableTypes = Collections.emptyMap();
+    // Set of symbols whose lexical scope has already ended.
+    private final Set<Symbol> invalidatedSymbols = new HashSet<>();
+
     // Stack for evaluated expression types.
     private final Deque<LvarType> typeStack = new ArrayDeque<>();
 
@@ -464,9 +474,19 @@
 
     @Override
     public boolean enterBlock(final Block block) {
+        boolean cloned = false;
         for(final Symbol symbol: block.getSymbols()) {
-            if(symbol.isBytecodeLocal() && getLocalVariableTypeOrNull(symbol) == null) {
-                setType(symbol, LvarType.UNDEFINED);
+            if(symbol.isBytecodeLocal()) {
+                if (getLocalVariableTypeOrNull(symbol) == null) {
+                    if (!cloned) {
+                        cloneOrNewLocalVariableTypes();
+                        cloned = true;
+                    }
+                    localVariableTypes.put(symbol, LvarType.UNDEFINED);
+                }
+                // In case we're repeating analysis of a lexical scope (e.g. it's in a loop),
+                // make sure all symbols lexically scoped by the block become valid again.
+                invalidatedSymbols.remove(symbol);
             }
         }
         return true;
@@ -1033,7 +1053,7 @@
 
         joinOnLabel(catchLabel);
         for(final CatchNode catchNode: tryNode.getCatches()) {
-            final IdentNode exception = catchNode.getException();
+            final IdentNode exception = catchNode.getExceptionIdentifier();
             onAssignment(exception, LvarType.OBJECT);
             final Expression condition = catchNode.getExceptionCondition();
             if(condition != null) {
@@ -1046,15 +1066,11 @@
             // throw an exception.
             reachable = true;
             catchBody.accept(this);
-            final Symbol exceptionSymbol = exception.getSymbol();
             if(reachable) {
-                localVariableTypes = cloneMap(localVariableTypes);
-                localVariableTypes.remove(exceptionSymbol);
                 jumpToLabel(catchBody, endLabel);
                 canExit = true;
             }
-            localVariableTypes = cloneMap(afterConditionTypes);
-            localVariableTypes.remove(exceptionSymbol);
+            localVariableTypes = afterConditionTypes;
         }
         // NOTE: if we had one or more conditional catch blocks with no unconditional catch block following them, then
         // there will be an unconditional rethrow, so the join point can never be reached from the last
@@ -1204,7 +1220,7 @@
     }
 
     private void jumpToLabel(final JoinPredecessor jumpOrigin, final Label label, final Map<Symbol, LvarType> types) {
-        getOrCreateJumpTarget(label).addOrigin(jumpOrigin, types);
+        getOrCreateJumpTarget(label).addOrigin(jumpOrigin, types, this);
     }
 
     @Override
@@ -1226,16 +1242,18 @@
 
         boolean cloned = false;
         for(final Symbol symbol: block.getSymbols()) {
-            // Undefine the symbol outside the block
-            if(localVariableTypes.containsKey(symbol)) {
-                if(!cloned) {
-                    localVariableTypes = cloneMap(localVariableTypes);
-                    cloned = true;
+            if(symbol.hasSlot()) {
+                // Invalidate the symbol when its defining block ends
+                if (symbol.isBytecodeLocal()) {
+                    if(localVariableTypes.containsKey(symbol)) {
+                        if(!cloned) {
+                            localVariableTypes = cloneMap(localVariableTypes);
+                            cloned = true;
+                        }
+                    }
+                    invalidateSymbol(symbol);
                 }
-                localVariableTypes.remove(symbol);
-            }
 
-            if(symbol.hasSlot()) {
                 final SymbolConversions conversions = symbolConversions.get(symbol);
                 if(conversions != null) {
                     // Potentially make some currently dead types live if they're needed as a source of a type
@@ -1605,10 +1623,19 @@
         }
         assert symbol.hasSlot();
         assert !symbol.isGlobal();
-        localVariableTypes = localVariableTypes.isEmpty() ? new IdentityHashMap<Symbol, LvarType>() : cloneMap(localVariableTypes);
+        cloneOrNewLocalVariableTypes();
         localVariableTypes.put(symbol, type);
     }
 
+    private void cloneOrNewLocalVariableTypes() {
+        localVariableTypes = localVariableTypes.isEmpty() ? new HashMap<Symbol, LvarType>() : cloneMap(localVariableTypes);
+    }
+
+    private void invalidateSymbol(final Symbol symbol) {
+        localVariableTypes.remove(symbol);
+        invalidatedSymbols.add(symbol);
+    }
+
     /**
      * Set a flag in the symbol marking it as needing to be able to store a value of a particular type. Every symbol for
      * a local variable will be assigned between 1 and 6 local variable slots for storing all types it is known to need
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java	Tue Nov 22 11:45:55 2016 -0800
@@ -178,6 +178,15 @@
     }
 
     @Override
+    public boolean enterCatchNode(final CatchNode catchNode) {
+        Expression exception = catchNode.getException();
+        if ((exception != null) && !(exception instanceof IdentNode)) {
+            throwNotImplementedYet("es6.destructuring", exception);
+        }
+        return true;
+    }
+
+    @Override
     public Node leaveCatchNode(final CatchNode catchNode) {
         return addStatement(catchNode);
     }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/CatchNode.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/CatchNode.java	Tue Nov 22 11:45:55 2016 -0800
@@ -35,8 +35,8 @@
 public final class CatchNode extends Statement {
     private static final long serialVersionUID = 1L;
 
-    /** Exception identifier. */
-    private final IdentNode exception;
+    /** Exception binding identifier or binding pattern. */
+    private final Expression exception;
 
     /** Exception condition. */
     private final Expression exceptionCondition;
@@ -52,21 +52,27 @@
      * @param lineNumber         lineNumber
      * @param token              token
      * @param finish             finish
-     * @param exception          variable name of exception
+     * @param exception          variable name or pattern of exception
      * @param exceptionCondition exception condition
      * @param body               catch body
      * @param isSyntheticRethrow true if this node is a synthetically generated rethrow node.
      */
-    public CatchNode(final int lineNumber, final long token, final int finish, final IdentNode exception,
+    public CatchNode(final int lineNumber, final long token, final int finish, final Expression exception,
             final Expression exceptionCondition, final Block body, final boolean isSyntheticRethrow) {
         super(lineNumber, token, finish);
-        this.exception          = exception == null ? null : exception.setIsInitializedHere();
+        if (exception instanceof IdentNode) {
+            this.exception = ((IdentNode) exception).setIsInitializedHere();
+        } else if ((exception instanceof LiteralNode.ArrayLiteralNode) || (exception instanceof ObjectNode)) {
+            this.exception = exception;
+        } else {
+            throw new IllegalArgumentException("invalid catch parameter");
+        }
         this.exceptionCondition = exceptionCondition;
-        this.body               = body;
+        this.body = body;
         this.isSyntheticRethrow = isSyntheticRethrow;
     }
 
-    private CatchNode(final CatchNode catchNode, final IdentNode exception, final Expression exceptionCondition,
+    private CatchNode(final CatchNode catchNode, final Expression exception, final Expression exceptionCondition,
             final Block body, final boolean isSyntheticRethrow) {
         super(catchNode);
         this.exception          = exception;
@@ -83,11 +89,10 @@
     public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
         if (visitor.enterCatchNode(this)) {
             return visitor.leaveCatchNode(
-                setException((IdentNode)exception.accept(visitor)).
-                setExceptionCondition(exceptionCondition == null ? null : (Expression)exceptionCondition.accept(visitor)).
-                setBody((Block)body.accept(visitor)));
+                    setException((Expression) exception.accept(visitor)).
+                            setExceptionCondition(exceptionCondition == null ? null : (Expression) exceptionCondition.accept(visitor)).
+                            setBody((Block) body.accept(visitor)));
         }
-
         return this;
     }
 
@@ -109,14 +114,25 @@
     }
 
     /**
-     * Get the identifier representing the exception thrown
-     * @return the exception identifier
+     * Get the binding pattern representing the exception thrown
+     *
+     * @return the exception binding pattern
      */
-    public IdentNode getException() {
+    public Expression getException() {
         return exception;
     }
 
     /**
+     * Get the identifier representing the exception thrown
+     *
+     * @return the exception identifier
+     * @throws ClassCastException if exception set is not binding identifier
+     */
+    public IdentNode getExceptionIdentifier() {
+        return (IdentNode) exception;
+    }
+
+    /**
      * Get the exception condition for this catch block
      * @return the exception condition
      */
@@ -146,13 +162,19 @@
 
     /**
      * Resets the exception of a catch block
-     * @param exception new exception
+     *
+     * @param exception new exception which can be binding identifier or binding
+     * pattern
      * @return new catch node if changed, same otherwise
      */
-    public CatchNode setException(final IdentNode exception) {
+    public CatchNode setException(final Expression exception) {
         if (this.exception == exception) {
             return this;
         }
+        /*check if exception is legitimate*/
+        if (!((exception instanceof IdentNode) || (exception instanceof LiteralNode.ArrayLiteralNode) || (exception instanceof ObjectNode))) {
+            throw new IllegalArgumentException("invalid catch parameter");
+        }
         return new CatchNode(this, exception, exceptionCondition, body, isSyntheticRethrow);
     }
 
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/PrintVisitor.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/PrintVisitor.java	Tue Nov 22 11:45:55 2016 -0800
@@ -397,7 +397,7 @@
 
     @Override
     public boolean enterVarNode(final VarNode varNode) {
-        sb.append("var ");
+        sb.append(varNode.isConst() ? "const " : varNode.isLet() ? "let " : "var ");
         varNode.getName().toString(sb, printTypes);
         printLocalVariableConversion(varNode.getName());
         final Node init = varNode.getInit();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java	Tue Nov 22 11:45:55 2016 -0800
@@ -102,19 +102,9 @@
 
     private int templateExpressionOpenBraces;
 
-    private static final String SPACETAB = " \t";  // ASCII space and tab
-    private static final String LFCR     = "\n\r"; // line feed and carriage return (ctrl-m)
-
-    private static final String JAVASCRIPT_WHITESPACE_EOL =
-        LFCR +
+    private static final String JAVASCRIPT_OTHER_WHITESPACE =
         "\u2028" + // line separator
-        "\u2029"   // paragraph separator
-        ;
-    private static final String JAVASCRIPT_WHITESPACE =
-        SPACETAB +
-        JAVASCRIPT_WHITESPACE_EOL +
-        "\u000b" + // tabulation line
-        "\u000c" + // ff (ctrl-l)
+        "\u2029" + // paragraph separator
         "\u00a0" + // Latin-1 space
         "\u1680" + // Ogham space mark
         "\u180e" + // separator, Mongolian vowel
@@ -384,7 +374,13 @@
      * @return true if valid JavaScript whitespace
      */
     public static boolean isJSWhitespace(final char ch) {
-        return JAVASCRIPT_WHITESPACE.indexOf(ch) != -1;
+        return ch == ' '                  // space
+            || ch >= '\t' && ch <= '\r'   // 0x09..0x0d: tab, line feed, tabulation line, ff, carriage return
+            || ch >= 160 && isOtherJSWhitespace(ch);
+    }
+
+    private static boolean isOtherJSWhitespace(final char ch) {
+        return JAVASCRIPT_OTHER_WHITESPACE.indexOf(ch) != -1;
     }
 
     /**
@@ -393,7 +389,10 @@
      * @return true if valid JavaScript end of line
      */
     public static boolean isJSEOL(final char ch) {
-        return JAVASCRIPT_WHITESPACE_EOL.indexOf(ch) != -1;
+        return ch == '\n'      // line feed
+            || ch == '\r'      // carriage return (ctrl-m)
+            || ch == '\u2028'  // line separator
+            || ch == '\u2029'; // paragraph separator
     }
 
     /**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Tue Nov 22 11:45:55 2016 -0800
@@ -2619,13 +2619,23 @@
                 next();
                 expect(LPAREN);
 
-                // FIXME: ES6 catch parameter can be a BindingIdentifier or a BindingPattern
-                // We need to generalize this here!
+                // ES6 catch parameter can be a BindingIdentifier or a BindingPattern
                 // http://www.ecma-international.org/ecma-262/6.0/
-                final IdentNode exception = getIdent();
-
-                // ECMA 12.4.1 strict mode restrictions
-                verifyStrictIdent(exception, "catch argument");
+                final String contextString = "catch argument";
+                final Expression exception = bindingIdentifierOrPattern(contextString);
+                final boolean isDestructuring = !(exception instanceof IdentNode);
+                if (isDestructuring) {
+                    verifyDestructuringBindingPattern(exception, new Consumer<IdentNode>() {
+                        @Override
+                        public void accept(final IdentNode identNode) {
+                            verifyIdent(identNode, contextString);
+                        }
+                    });
+                } else {
+                    // ECMA 12.4.1 strict mode restrictions
+                    verifyStrictIdent((IdentNode) exception, "catch argument");
+                }
+
 
                 // Nashorn extension: catch clause can have optional
                 // condition. So, a single try can have more than one
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/es6/JDK-8168373.js	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2016 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.
+ */
+
+/**
+ * JDK-8168373: don't emit conversions for symbols outside their lexical scope
+ *
+ * @test
+ * @run
+ * @option --language=es6
+ */
+
+function p() { return false } // "predicate"
+function r(x) { return x } // "read"
+
+(function() {
+  try { // Try creates control flow edges from assignments into catch blocks.
+    // Lexically scoped, never read int variable (undefined at catch block) but still with a cf edge into catch block.
+    // Since it's never read, it's not written either (Nashorn optimizes some dead writes).
+    let x = 0; 
+    if (p()) { throw {}; } // We need `p()` so this block doesn't get optimized away, for possibility of a `throw` 
+    x = 0.0; // change the type of x to double
+    r(x); // read x otherwise it's optimized away
+  } catch (e) {} // under the bug, "throw" will try to widen unwritten int x to double for here and cause a verifier error
+})()
--- a/nashorn/test/script/basic/es6/destructuring.js	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/test/script/basic/es6/destructuring.js	Tue Nov 22 11:45:55 2016 -0800
@@ -62,4 +62,11 @@
 check("(function([x]) { return x; })()");
 check("for (var [[x, y, z] = [4, 5, 6]] = [7, 8, 9]; iterCount < 1; ) ;");
 check("for ([ arrow = () => {} ] of [[]]) ;");
+check("try { throw null;} catch({}) { }");
+check("try { throw {} } catch ({}) { }");
+check("try { throw [] } catch ([,]) { }");
+check("try { throw { w: [7, undefined, ] }} catch ({ w: [x, y, z] = [4, 5, 6] }) { }");
+check("try { throw { a: 2, b: 3} } catch ({a, b}) { }");
+check("try { throw [null] } catch ([[x]]) { }");
+check("try { throw { w: undefined } } catch ({ w: { x, y, z } = { x: 4, y: 5, z: 6 } }) { }");
 
--- a/nashorn/test/script/basic/es6/destructuring.js.EXPECTED	Wed Nov 16 14:27:23 2016 -0800
+++ b/nashorn/test/script/basic/es6/destructuring.js.EXPECTED	Tue Nov 22 11:45:55 2016 -0800
@@ -70,3 +70,24 @@
 java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:0 ES6 destructuring is not yet implemented
 for ([ arrow = () => {} ] of [[]]) ;
 ^
+java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:25 ES6 destructuring is not yet implemented
+try { throw null;} catch({}) { }
+                         ^
+java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:24 ES6 destructuring is not yet implemented
+try { throw {} } catch ({}) { }
+                        ^
+java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:24 ES6 destructuring is not yet implemented
+try { throw [] } catch ([,]) { }
+                        ^
+java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:44 ES6 destructuring is not yet implemented
+try { throw { w: [7, undefined, ] }} catch ({ w: [x, y, z] = [4, 5, 6] }) { }
+                                            ^
+java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:35 ES6 destructuring is not yet implemented
+try { throw { a: 2, b: 3} } catch ({a, b}) { }
+                                   ^
+java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:28 ES6 destructuring is not yet implemented
+try { throw [null] } catch ([[x]]) { }
+                            ^
+java.lang.RuntimeException: test/script/basic/es6/destructuring.js#35:6<eval>:1:38 ES6 destructuring is not yet implemented
+try { throw { w: undefined } } catch ({ w: { x, y, z } = { x: 4, y: 5, z: 6 } }) { }
+                                      ^
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/destructuring_catch.js	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+/**
+ * Tests to check representation of ES6 catch parameter as binding pattern.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+load(__DIR__ + "utils.js")
+
+var code = <<EOF
+
+try { throw null;} catch({}) { }
+try { throw {} } catch ({}) { }
+try { throw [] } catch ([,]) { }
+try { throw { w: [7, undefined, ] }} catch ({ w: [x, y, z] = [4, 5, 6] }) { }
+try { throw { a: 2, b: 3} } catch ({a, b}) { }
+try { throw [null] } catch ([[x]]) { }
+try { throw { w: undefined } } catch ({ w: { x, y, z } = { x: 4, y: 5, z: 6 } }) { }
+
+EOF
+
+parse("destructuring_catch.js", code, "--language=es6", new (Java.extend(visitor_es6, {
+    visitCatch : function (node, obj) {
+        obj.push(convert(node))
+    }
+})))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/destructuring_catch.js.EXPECTED	Tue Nov 22 11:45:55 2016 -0800
@@ -0,0 +1,399 @@
+[
+  {
+    "condition": "null",
+    "endPosition": "33",
+    "kind": "CATCH",
+    "parameter": {
+      "endPosition": "28",
+      "kind": "OBJECT_LITERAL",
+      "startPosition": "26",
+      "properties": []
+    },
+    "block": {
+      "endPosition": "33",
+      "kind": "BLOCK",
+      "statements": [],
+      "startPosition": "30"
+    },
+    "startPosition": "20"
+  },
+  {
+    "condition": "null",
+    "endPosition": "65",
+    "kind": "CATCH",
+    "parameter": {
+      "endPosition": "60",
+      "kind": "OBJECT_LITERAL",
+      "startPosition": "58",
+      "properties": []
+    },
+    "block": {
+      "endPosition": "65",
+      "kind": "BLOCK",
+      "statements": [],
+      "startPosition": "62"
+    },
+    "startPosition": "51"
+  },
+  {
+    "condition": "null",
+    "endPosition": "98",
+    "kind": "CATCH",
+    "parameter": {
+      "endPosition": "93",
+      "kind": "ARRAY_LITERAL",
+      "elements": [
+        null
+      ],
+      "startPosition": "90"
+    },
+    "block": {
+      "endPosition": "98",
+      "kind": "BLOCK",
+      "statements": [],
+      "startPosition": "95"
+    },
+    "startPosition": "83"
+  },
+  {
+    "condition": "null",
+    "endPosition": "176",
+    "kind": "CATCH",
+    "parameter": {
+      "endPosition": "171",
+      "kind": "OBJECT_LITERAL",
+      "startPosition": "143",
+      "properties": [
+        {
+          "getter": "null",
+          "endPosition": "169",
+          "kind": "PROPERTY",
+          "setter": "null",
+          "value": {
+            "expression": {
+              "endPosition": "169",
+              "kind": "ARRAY_LITERAL",
+              "elements": [
+                {
+                  "endPosition": "162",
+                  "kind": "NUMBER_LITERAL",
+                  "value": "4",
+                  "startPosition": "161"
+                },
+                {
+                  "endPosition": "165",
+                  "kind": "NUMBER_LITERAL",
+                  "value": "5",
+                  "startPosition": "164"
+                },
+                {
+                  "endPosition": "168",
+                  "kind": "NUMBER_LITERAL",
+                  "value": "6",
+                  "startPosition": "167"
+                }
+              ],
+              "startPosition": "160"
+            },
+            "endPosition": "169",
+            "kind": "ASSIGNMENT",
+            "variable": {
+              "endPosition": "157",
+              "kind": "ARRAY_LITERAL",
+              "elements": [
+                {
+                  "endPosition": "150",
+                  "kind": "IDENTIFIER",
+                  "name": "x",
+                  "startPosition": "149"
+                },
+                {
+                  "endPosition": "153",
+                  "kind": "IDENTIFIER",
+                  "name": "y",
+                  "startPosition": "152"
+                },
+                {
+                  "endPosition": "156",
+                  "kind": "IDENTIFIER",
+                  "name": "z",
+                  "startPosition": "155"
+                }
+              ],
+              "startPosition": "148"
+            },
+            "startPosition": "148"
+          },
+          "startPosition": "145",
+          "key": {
+            "endPosition": "146",
+            "kind": "IDENTIFIER",
+            "name": "w",
+            "startPosition": "145"
+          }
+        }
+      ]
+    },
+    "block": {
+      "endPosition": "176",
+      "kind": "BLOCK",
+      "statements": [],
+      "startPosition": "173"
+    },
+    "startPosition": "136"
+  },
+  {
+    "condition": "null",
+    "endPosition": "223",
+    "kind": "CATCH",
+    "parameter": {
+      "endPosition": "218",
+      "kind": "OBJECT_LITERAL",
+      "startPosition": "212",
+      "properties": [
+        {
+          "getter": "null",
+          "endPosition": "214",
+          "kind": "PROPERTY",
+          "setter": "null",
+          "value": {
+            "endPosition": "214",
+            "kind": "IDENTIFIER",
+            "name": "a",
+            "startPosition": "213"
+          },
+          "startPosition": "213",
+          "key": {
+            "endPosition": "214",
+            "kind": "IDENTIFIER",
+            "name": "a",
+            "startPosition": "213"
+          }
+        },
+        {
+          "getter": "null",
+          "endPosition": "217",
+          "kind": "PROPERTY",
+          "setter": "null",
+          "value": {
+            "endPosition": "217",
+            "kind": "IDENTIFIER",
+            "name": "b",
+            "startPosition": "216"
+          },
+          "startPosition": "216",
+          "key": {
+            "endPosition": "217",
+            "kind": "IDENTIFIER",
+            "name": "b",
+            "startPosition": "216"
+          }
+        }
+      ]
+    },
+    "block": {
+      "endPosition": "223",
+      "kind": "BLOCK",
+      "statements": [],
+      "startPosition": "220"
+    },
+    "startPosition": "205"
+  },
+  {
+    "condition": "null",
+    "endPosition": "262",
+    "kind": "CATCH",
+    "parameter": {
+      "endPosition": "257",
+      "kind": "ARRAY_LITERAL",
+      "elements": [
+        {
+          "endPosition": "256",
+          "kind": "ARRAY_LITERAL",
+          "elements": [
+            {
+              "endPosition": "255",
+              "kind": "IDENTIFIER",
+              "name": "x",
+              "startPosition": "254"
+            }
+          ],
+          "startPosition": "253"
+        }
+      ],
+      "startPosition": "252"
+    },
+    "block": {
+      "endPosition": "262",
+      "kind": "BLOCK",
+      "statements": [],
+      "startPosition": "259"
+    },
+    "startPosition": "245"
+  },
+  {
+    "condition": "null",
+    "endPosition": "347",
+    "kind": "CATCH",
+    "parameter": {
+      "endPosition": "342",
+      "kind": "OBJECT_LITERAL",
+      "startPosition": "301",
+      "properties": [
+        {
+          "getter": "null",
+          "endPosition": "340",
+          "kind": "PROPERTY",
+          "setter": "null",
+          "value": {
+            "expression": {
+              "endPosition": "340",
+              "kind": "OBJECT_LITERAL",
+              "startPosition": "320",
+              "properties": [
+                {
+                  "getter": "null",
+                  "endPosition": "326",
+                  "kind": "PROPERTY",
+                  "setter": "null",
+                  "value": {
+                    "endPosition": "326",
+                    "kind": "NUMBER_LITERAL",
+                    "value": "4",
+                    "startPosition": "325"
+                  },
+                  "startPosition": "322",
+                  "key": {
+                    "endPosition": "323",
+                    "kind": "IDENTIFIER",
+                    "name": "x",
+                    "startPosition": "322"
+                  }
+                },
+                {
+                  "getter": "null",
+                  "endPosition": "332",
+                  "kind": "PROPERTY",
+                  "setter": "null",
+                  "value": {
+                    "endPosition": "332",
+                    "kind": "NUMBER_LITERAL",
+                    "value": "5",
+                    "startPosition": "331"
+                  },
+                  "startPosition": "328",
+                  "key": {
+                    "endPosition": "329",
+                    "kind": "IDENTIFIER",
+                    "name": "y",
+                    "startPosition": "328"
+                  }
+                },
+                {
+                  "getter": "null",
+                  "endPosition": "338",
+                  "kind": "PROPERTY",
+                  "setter": "null",
+                  "value": {
+                    "endPosition": "338",
+                    "kind": "NUMBER_LITERAL",
+                    "value": "6",
+                    "startPosition": "337"
+                  },
+                  "startPosition": "334",
+                  "key": {
+                    "endPosition": "335",
+                    "kind": "IDENTIFIER",
+                    "name": "z",
+                    "startPosition": "334"
+                  }
+                }
+              ]
+            },
+            "endPosition": "340",
+            "kind": "ASSIGNMENT",
+            "variable": {
+              "endPosition": "317",
+              "kind": "OBJECT_LITERAL",
+              "startPosition": "306",
+              "properties": [
+                {
+                  "getter": "null",
+                  "endPosition": "309",
+                  "kind": "PROPERTY",
+                  "setter": "null",
+                  "value": {
+                    "endPosition": "309",
+                    "kind": "IDENTIFIER",
+                    "name": "x",
+                    "startPosition": "308"
+                  },
+                  "startPosition": "308",
+                  "key": {
+                    "endPosition": "309",
+                    "kind": "IDENTIFIER",
+                    "name": "x",
+                    "startPosition": "308"
+                  }
+                },
+                {
+                  "getter": "null",
+                  "endPosition": "312",
+                  "kind": "PROPERTY",
+                  "setter": "null",
+                  "value": {
+                    "endPosition": "312",
+                    "kind": "IDENTIFIER",
+                    "name": "y",
+                    "startPosition": "311"
+                  },
+                  "startPosition": "311",
+                  "key": {
+                    "endPosition": "312",
+                    "kind": "IDENTIFIER",
+                    "name": "y",
+                    "startPosition": "311"
+                  }
+                },
+                {
+                  "getter": "null",
+                  "endPosition": "315",
+                  "kind": "PROPERTY",
+                  "setter": "null",
+                  "value": {
+                    "endPosition": "315",
+                    "kind": "IDENTIFIER",
+                    "name": "z",
+                    "startPosition": "314"
+                  },
+                  "startPosition": "314",
+                  "key": {
+                    "endPosition": "315",
+                    "kind": "IDENTIFIER",
+                    "name": "z",
+                    "startPosition": "314"
+                  }
+                }
+              ]
+            },
+            "startPosition": "306"
+          },
+          "startPosition": "303",
+          "key": {
+            "endPosition": "304",
+            "kind": "IDENTIFIER",
+            "name": "w",
+            "startPosition": "303"
+          }
+        }
+      ]
+    },
+    "block": {
+      "endPosition": "347",
+      "kind": "BLOCK",
+      "statements": [],
+      "startPosition": "344"
+    },
+    "startPosition": "294"
+  }
+]
--- a/test/failure_handler/Makefile	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/failure_handler/Makefile	Tue Nov 22 11:45:55 2016 -0800
@@ -86,7 +86,7 @@
 test: require_env build
 	rm -rf "${RUN_DIR}"
 	mkdir -p "${RUN_DIR}"
-	"${JTREG_HOME}"/bin/jtreg                                               \
+	"${JTREG_HOME}"/bin/jtreg                                           \
         -jdk:"${JAVA_HOME}"                                                 \
         ${JTREG_TEST_OPTS}                                                  \
         -timeout:0.1 -va -retain:all                                        \
@@ -94,6 +94,7 @@
         -agentvm                                                            \
         -thd:"${TARGET_JAR}"                                                \
         -th:jdk.test.failurehandler.jtreg.GatherProcessInfoTimeoutHandler   \
+        -thtimeout:0                                                        \
         -od:"${TARGET_JAR}"                                                 \
         -o:jdk.test.failurehandler.jtreg.GatherDiagnosticInfoObserver       \
         -w:"${RUN_DIR}/JTwork"                                              \
--- a/test/failure_handler/src/share/classes/jdk/test/failurehandler/HtmlSection.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/HtmlSection.java	Tue Nov 22 11:45:55 2016 -0800
@@ -49,7 +49,7 @@
 
     private HtmlSection(PrintWriter pw, String id, String name, HtmlSection rootSection) {
         this.pw = pw;
-        textWriter = new PrintWriter(new HtmlFilterWriter(pw));
+        textWriter = new PrintWriter(new HtmlFilterWriter(pw), true);
         this.id = id;
         this.name = name;
         child = null;
--- a/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionHelper.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionHelper.java	Tue Nov 22 11:45:55 2016 -0800
@@ -164,7 +164,8 @@
         Stopwatch stopwatch = new Stopwatch();
         stopwatch.start();
 
-        log.printf("%s%n[%tF %<tT] %s%n%1$s%n", line, new Date(), pb.command());
+        log.printf("%s%n[%tF %<tT] %s timeout=%s%n%1$s%n", line, new Date(), pb.command(), params.timeout);
+
         Process process;
         KillerTask killer;
 
@@ -178,30 +179,28 @@
                     out);
             try {
                 result = new ExitCode(process.waitFor());
+            } catch (InterruptedException e) {
+                log.println("WARNING: interrupted when waiting for the tool:%n");
+                e.printStackTrace(log);
+            } finally {
                 killer.cancel();
-            } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-                if (!killer.cancel()) {
-                    log.println(
-                            "WARNING: interrupted when waiting for the tool:");
-                    e.printStackTrace(log);
-                }
             }
             if (killer.hasTimedOut()) {
                 log.printf(
                         "WARNING: tool timed out: killed process after %d ms%n",
-                        TimeUnit.MILLISECONDS.toMicros(params.timeout));
+                        params.timeout);
                 result = ExitCode.TIMED_OUT;
             }
         } catch (IOException e) {
+            log.printf("WARNING: caught IOException while running tool%n");
             e.printStackTrace(log);
             result = ExitCode.LAUNCH_ERROR;
         }
 
         stopwatch.stop();
-        log.printf("%s%n[%tF %<tT] exit code : %d time : %d ms%n%1$s%n",
+        log.printf("%s%n[%tF %<tT] exit code: %d time: %d ms%n%1$s%n",
                 line, new Date(), result.value,
-                TimeUnit.MILLISECONDS.toSeconds(stopwatch.getElapsedTimeNs()));
+                TimeUnit.NANOSECONDS.toMillis(stopwatch.getElapsedTimeNs()));
         return result;
     }
 
@@ -247,7 +246,7 @@
             log.printf("WARNING: can't run jps : %s%n", e.getMessage());
             e.printStackTrace(log);
         } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
+            log.printf("WARNING: interrupted%n");
             e.printStackTrace(log);
         }
         return result;
@@ -266,8 +265,7 @@
             try {
                 process.exitValue();
             } catch (IllegalThreadStateException e) {
-                // !prepareProcess.isAlive()
-                process.destroy();
+                process.destroyForcibly();
                 timedOut = true;
             }
         }
@@ -301,11 +299,15 @@
                             exitCode.value);
                     break;
                 }
-                try {
-                    Thread.sleep(params.pause);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    e.printStackTrace(sectionWriter);
+                // sleep, if this is not the last iteration
+                if (i < n - 1) {
+                    try {
+                        Thread.sleep(params.pause);
+                    } catch (InterruptedException e) {
+                        sectionWriter.printf(
+                                "WARNING: interrupted while sleeping between invocations");
+                        e.printStackTrace(sectionWriter);
+                    }
                 }
             }
         } else {
--- a/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherDiagnosticInfoObserver.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherDiagnosticInfoObserver.java	Tue Nov 22 11:45:55 2016 -0800
@@ -68,7 +68,7 @@
         boolean needClose = false;
         try {
             log = new PrintWriter(new FileWriter(
-                    workDir.resolve(LOG_FILENAME).toFile(), true));
+                    workDir.resolve(LOG_FILENAME).toFile(), true), true);
             needClose = true;
         } catch (IOException e) {
             log = new PrintWriter(System.out);
@@ -100,7 +100,7 @@
                                EnvironmentInfoGatherer gatherer) {
         File output = workDir.resolve(ENVIRONMENT_OUTPUT).toFile();
         try (HtmlPage html = new HtmlPage(new PrintWriter(
-                new FileWriter(output, true)))) {
+                new FileWriter(output, true), true))) {
             try (ElapsedTimePrinter timePrinter
                          = new ElapsedTimePrinter(new Stopwatch(), name, log)) {
                 gatherer.gatherEnvironmentInfo(html.getRootSection());
--- a/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherProcessInfoTimeoutHandler.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherProcessInfoTimeoutHandler.java	Tue Nov 22 11:45:55 2016 -0800
@@ -70,9 +70,9 @@
         String name = getClass().getName();
         PrintWriter actionsLog;
         try {
-            // try to open a separate file for aciton log
+            // try to open a separate file for action log
             actionsLog = new PrintWriter(new FileWriter(
-                    workDir.resolve(LOG_FILENAME).toFile(), true));
+                    workDir.resolve(LOG_FILENAME).toFile(), true), true);
         } catch (IOException e) {
             // use jtreg log as a fallback
             actionsLog = log;
@@ -84,7 +84,7 @@
 
             File output = workDir.resolve(OUTPUT_FILENAME).toFile();
             try {
-                PrintWriter pw = new PrintWriter(new FileWriter(output, true));
+                PrintWriter pw = new PrintWriter(new FileWriter(output, true), true);
                 runGatherer(name, workDir, actionsLog, pw, pid);
             } catch (IOException e) {
                 actionsLog.printf("IOException: cannot open output file[%s] : %s",
--- a/test/jtreg-ext/requires/VMProps.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/jtreg-ext/requires/VMProps.java	Tue Nov 22 11:45:55 2016 -0800
@@ -59,6 +59,7 @@
         map.put("vm.bits", vmBits());
         map.put("vm.flightRecorder", vmFlightRecorder());
         map.put("vm.simpleArch", vmArch());
+        map.put("vm.debug", vmDebug());
         vmGC(map); // vm.gc.X = true/false
 
         dump(map);
@@ -148,6 +149,13 @@
     }
 
     /**
+     * @return debug level value extracted from the "jdk.debug" property.
+     */
+    protected String vmDebug() {
+        return "" + System.getProperty("jdk.debug").contains("debug");
+    }
+
+    /**
      * For all existing GC sets vm.gc.X property.
      * Example vm.gc.G1=true means:
      *    VM supports G1
--- a/test/lib/jdk/test/lib/apps/LingeredApp.java	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/lib/jdk/test/lib/apps/LingeredApp.java	Tue Nov 22 11:45:55 2016 -0800
@@ -67,12 +67,13 @@
 public class LingeredApp {
 
     private static final long spinDelay = 1000;
-    private static final int appWaitTime = 100;
+
+    private long lockCreationTime;
+    private final ArrayList<String> storedAppOutput;
 
-    private final String lockFileName;
-    private long lockCreationTime;
-    private Process appProcess;
-    private final ArrayList<String> storedAppOutput;
+    protected Process appProcess;
+    protected static final int appWaitTime = 100;
+    protected final String lockFileName;
 
     /*
      * Drain child process output, store it into string array
@@ -255,14 +256,10 @@
     }
 
     /**
-     * Run the app
-     *
-     * @param vmArguments
-     * @throws IOException
+     * Analyze an environment and prepare a command line to
+     * run the app, app name should be added explicitly
      */
-    public void runApp(List<String> vmArguments)
-            throws IOException {
-
+    public List<String> runAppPrepare(List<String> vmArguments) {
         // We should always use testjava or throw an exception,
         // so we can't use JDKToolFinder.getJDKTool("java");
         // that falls back to compile java on error
@@ -303,28 +300,52 @@
         String classpath = System.getProperty("test.class.path");
         cmd.add((classpath == null) ? "." : classpath);
 
-        cmd.add(this.getAppName());
-        cmd.add(lockFileName);
+        return cmd;
+    }
 
-        // Reporting
+    /**
+     * Assemble command line to a printable string
+     */
+    public void printCommandLine(List<String> cmd) {
+        // A bit of verbosity
         StringBuilder cmdLine = new StringBuilder();
         for (String strCmd : cmd) {
             cmdLine.append("'").append(strCmd).append("' ");
         }
 
-        // A bit of verbosity
         System.out.println("Command line: [" + cmdLine.toString() + "]");
+    }
+
+    public void startGobblerPipe() {
+      // Create pipe reader for process, and read stdin and stderr to array of strings
+      InputGobbler gb = new InputGobbler(appProcess.getInputStream(), storedAppOutput);
+      gb.start();
+    }
+
+    /**
+     * Run the app.
+     *
+     * @param vmArguments
+     * @throws IOException
+     */
+    public void runApp(List<String> vmArguments)
+            throws IOException {
+
+        List<String> cmd = runAppPrepare(vmArguments);
+
+        cmd.add(this.getAppName());
+        cmd.add(lockFileName);
+
+        printCommandLine(cmd);
 
         ProcessBuilder pb = new ProcessBuilder(cmd);
         // we don't expect any error output but make sure we are not stuck on pipe
         // pb.redirectErrorStream(false);
+        // ProcessBuilder.start can throw IOException
         pb.redirectError(ProcessBuilder.Redirect.INHERIT);
-
         appProcess = pb.start();
 
-        // Create pipe reader for process, and read stdin and stderr to array of strings
-        InputGobbler gb = new InputGobbler(appProcess.getInputStream(), storedAppOutput);
-        gb.start();
+        startGobblerPipe();
     }
 
     /**
@@ -334,10 +355,14 @@
      */
     public void stopApp() throws IOException {
         deleteLock();
-        waitAppTerminate();
-        int exitcode = appProcess.exitValue();
-        if (exitcode != 0) {
-            throw new IOException("LingeredApp terminated with non-zero exit code " + exitcode);
+        // The startApp() of the derived app can throw
+        // an exception before the LA actually starts
+        if (appProcess != null) {
+            waitAppTerminate();
+            int exitcode = appProcess.exitValue();
+            if (exitcode != 0) {
+                throw new IOException("LingeredApp terminated with non-zero exit code " + exitcode);
+            }
         }
     }
 
--- a/test/make/TestMakeBase.gmk	Wed Nov 16 14:27:23 2016 -0800
+++ b/test/make/TestMakeBase.gmk	Tue Nov 22 11:45:55 2016 -0800
@@ -226,10 +226,11 @@
     Wrong contents in vardeps file))
 
 # Test with a variable value containing some problematic characters
-VARDEP_TEST_VAR3 := foo '""' "''" bar \$$ORIGIN
+VARDEP_TEST_VAR3 := foo '""' "''" bar \$$ORIGIN &\#x00a9
 VARDEP_VALUE_FILE := $(call DependOnVariable, VARDEP_TEST_VAR3)
 -include $(VARDEP_VALUE_FILE)
-$(eval $(call assert-equals, $(VARDEP_TEST_VAR3_old), $(VARDEP_TEST_VAR3), \
+$(eval $(call assert-equals, $(call EscapeHash,$(VARDEP_TEST_VAR3_old)), \
+    $(call EscapeHash,$(VARDEP_TEST_VAR3)), \
     Wrong contents in vardep file))
 
 TEST_TARGETS += test-vardep