Merge jdk-9+145
authorduke
Wed, 05 Jul 2017 22:27:20 +0200
changeset 42002 3ee4e7827413
parent 42001 b91683ebc1ba (diff)
parent 41946 6a64fa503141 (current diff)
child 42003 6d791dccfefe
child 42004 1df964275937
child 42011 94bbcefde876
child 42013 4cae0ace19be
child 42089 5bd077770786
child 42093 73e29d0ee80c
child 42094 c0cb9b0980be
child 42111 d139f0e91e7e
child 42113 d3b3593acddf
child 42115 0a25cf6b2f8d
child 42118 2d04dd69ce26
child 42119 49c1a2e4e4f2
child 42123 b6cdbc174c21
child 42124 640a383428fb
child 42128 6003e36b56df
child 42258 a1aafd5ea6ec
Merge
--- a/.hgtags-top-repo	Wed Jul 05 22:26:07 2017 +0200
+++ b/.hgtags-top-repo	Wed Jul 05 22:27:20 2017 +0200
@@ -386,3 +386,4 @@
 f64afae7f1a5608e438585bbf0bc23785e69cba0 jdk-9+141
 2b3e5caafe3594ea507c37675c4d3086f415dc64 jdk-9+142
 1fc62b1c629fb80fdaa639d3b59452a184f0d705 jdk-9+143
+8d337fd6333e28c48aa87880144b840aad82baaf jdk-9+144
--- a/common/autoconf/flags.m4	Wed Jul 05 22:26:07 2017 +0200
+++ b/common/autoconf/flags.m4	Wed Jul 05 22:27:20 2017 +0200
@@ -942,7 +942,7 @@
       # Little endian machine uses ELFv2 ABI.
       $2JVM_CFLAGS="[$]$2JVM_CFLAGS -DABI_ELFv2"
       # Use Power8, this is the first CPU to support PPC64 LE with ELFv2 ABI.
-      $2JVM_CFLAGS="[$]$2JVM_CFLAGS -mcpu=power7 -mtune=power8"
+      $2JVM_CFLAGS="[$]$2JVM_CFLAGS -mcpu=power8 -mtune=power8"
     fi
   elif test "x$OPENJDK_$1_CPU" = xs390x; then
     if test "x$OPENJDK_$1_OS" = xlinux; then
--- a/common/autoconf/generated-configure.sh	Wed Jul 05 22:26:07 2017 +0200
+++ b/common/autoconf/generated-configure.sh	Wed Jul 05 22:27:20 2017 +0200
@@ -5093,7 +5093,7 @@
 #CUSTOM_AUTOCONF_INCLUDE
 
 # Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1478524503
+DATE_WHEN_GENERATED=1479120453
 
 ###############################################################################
 #
@@ -50124,7 +50124,7 @@
       # Little endian machine uses ELFv2 ABI.
       JVM_CFLAGS="$JVM_CFLAGS -DABI_ELFv2"
       # Use Power8, this is the first CPU to support PPC64 LE with ELFv2 ABI.
-      JVM_CFLAGS="$JVM_CFLAGS -mcpu=power7 -mtune=power8"
+      JVM_CFLAGS="$JVM_CFLAGS -mcpu=power8 -mtune=power8"
     fi
   elif test "x$OPENJDK_TARGET_CPU" = xs390x; then
     if test "x$OPENJDK_TARGET_OS" = xlinux; then
@@ -50948,7 +50948,7 @@
       # Little endian machine uses ELFv2 ABI.
       OPENJDK_BUILD_JVM_CFLAGS="$OPENJDK_BUILD_JVM_CFLAGS -DABI_ELFv2"
       # Use Power8, this is the first CPU to support PPC64 LE with ELFv2 ABI.
-      OPENJDK_BUILD_JVM_CFLAGS="$OPENJDK_BUILD_JVM_CFLAGS -mcpu=power7 -mtune=power8"
+      OPENJDK_BUILD_JVM_CFLAGS="$OPENJDK_BUILD_JVM_CFLAGS -mcpu=power8 -mtune=power8"
     fi
   elif test "x$OPENJDK_BUILD_CPU" = xs390x; then
     if test "x$OPENJDK_BUILD_OS" = xlinux; then
--- a/common/bin/compare.sh	Wed Jul 05 22:26:07 2017 +0200
+++ b/common/bin/compare.sh	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/common/bin/compare_exceptions.sh.incl	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/corba/.hgtags	Wed Jul 05 22:27:20 2017 +0200
@@ -386,3 +386,4 @@
 b32f998da32b488ec7c4e9dbb3c750841b48e74d jdk-9+141
 408c9c621938ca028e20bced0459f815de47eba8 jdk-9+142
 6211236ef15ec796806357608b1dd1b70c258ece jdk-9+143
+d4f1dae174098e799c48948e866054c52e11a186 jdk-9+144
--- a/hotspot/.hgtags	Wed Jul 05 22:26:07 2017 +0200
+++ b/hotspot/.hgtags	Wed Jul 05 22:27:20 2017 +0200
@@ -546,3 +546,4 @@
 160a00bc6ed0af1fdf8418fc65e6bddbbc0c536d jdk-9+141
 7b48d63dfd6b8e2657288de3d7b1f153dee02d7e jdk-9+142
 d87d5d430c42342f0320ca7f5cbe0cbd1f9d62ba jdk-9+143
+6187b582d02aee38341dc8ce4011906e9b364e9f jdk-9+144
--- a/jaxp/.hgtags	Wed Jul 05 22:26:07 2017 +0200
+++ b/jaxp/.hgtags	Wed Jul 05 22:27:20 2017 +0200
@@ -386,3 +386,4 @@
 037c095ba0c345edbeaaab52fda913a76c3930c0 jdk-9+141
 bdafa0cc34a97a2f8db4847a4efd34b407943591 jdk-9+142
 ce81d03ad7320dca3d673374c1a33bc0efd9136a jdk-9+143
+99be33734ff62b75116b1202d49a4d4e1bda4226 jdk-9+144
--- a/jaxws/.hgtags	Wed Jul 05 22:26:07 2017 +0200
+++ b/jaxws/.hgtags	Wed Jul 05 22:27:20 2017 +0200
@@ -389,3 +389,4 @@
 b2c18f755228d1d19a86cd7d5fa1abb6b1495dfb jdk-9+141
 59101416d90160cfcb4f45dfbccaec15e2c27a29 jdk-9+142
 1c988e708a06257119d54d8a57e99e3b0f37ff18 jdk-9+143
+92523c51d6a48b0a83912ba3cc43bc57b8159c2a jdk-9+144
--- a/jdk/.hgtags	Wed Jul 05 22:26:07 2017 +0200
+++ b/jdk/.hgtags	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/data/tzdata/VERSION	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/data/tzdata/antarctica	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/data/tzdata/asia	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/data/tzdata/australasia	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/data/tzdata/europe	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/data/tzdata/zone.tab	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.compiler.gmk	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.javadoc.gmk	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.jdeps.gmk	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.jlink.gmk	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.jshell.gmk	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/mapfiles/libjava/mapfile-vers	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/mapfiles/libjava/reorder-sparc	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/mapfiles/libjava/reorder-sparcv9	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/make/mapfiles/libjava/reorder-x86	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/linux/classes/sun/nio/ch/EPollArrayWrapper.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/macosx/conf/x86_64/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/io/FileInputStream.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/NetworkInterface.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Optional.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/RSAClientKeyExchange.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/util/AlgorithmDecomposer.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/util/AnchorCertificates.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/lib/security/default.policy	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/native/launcher/defines.h	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/native/launcher/main.c	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/native/libjava/FileInputStream.c	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/native/libjli/java.c	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/share/native/libjli/java.h	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/aarch64/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/amd64/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/i586/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/ia64/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/ppc64/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/ppc64le/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/s390x/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/sparc/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/sparcv9/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/unix/conf/zero/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ /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 Jul 05 22:26:07 2017 +0200
+++ /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 Jul 05 22:26:07 2017 +0200
+++ /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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/windows/conf/amd64/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/windows/conf/i586/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/windows/conf/ia64/jvm.cfg	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/java.base/windows/native/libjli/java_md.c	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/TEST.ROOT	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/com/sun/net/httpserver/TEST.properties	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/net/www/http/HttpClient/RetryPost.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ /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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/net/www/http/KeepAliveStream/InfiniteLoop.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/net/www/protocol/http/NoNTLM.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/security/tools/keytool/KeyToolTest.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/security/tools/keytool/PrintSSL.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ /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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/util/calendar/zi/tzdata/VERSION	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/util/calendar/zi/tzdata/antarctica	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/util/calendar/zi/tzdata/asia	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/util/calendar/zi/tzdata/australasia	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/util/calendar/zi/tzdata/europe	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/jdk/test/sun/util/calendar/zi/tzdata/zone.tab	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/.hgtags	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Scope.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AbstractMemberBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeFieldBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberMap.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Module.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleAnalyzer.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/test/jdk/javadoc/doclet/testOrdering/TestOrdering.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ /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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/test/jdk/javadoc/tool/modules/Modules.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/test/tools/javac/modules/PatchModulesTest.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/test/tools/jdeps/DotFileTest.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/test/tools/jdeps/lib/JdepsRunner.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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/nashorn/.hgtags	Wed Jul 05 22:26:07 2017 +0200
+++ b/nashorn/.hgtags	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/CatchNode.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/PrintVisitor.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/test/script/basic/es6/destructuring.js	Wed Jul 05 22:27:20 2017 +0200
@@ -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 Jul 05 22:26:07 2017 +0200
+++ b/nashorn/test/script/basic/es6/destructuring.js.EXPECTED	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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	Wed Jul 05 22:27:20 2017 +0200
@@ -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"
+  }
+]