changeset 49586:e7689c543646

Merge
author mikael
date Thu, 12 Apr 2018 13:28:52 -0700
parents f7d3f7b5648f 0c3e252cea44
children c3ce7781e3ff
files make/autoconf/configure.ac make/autoconf/spec.gmk.in make/conf/jib-profiles.js make/hotspot/lib/CompileDtracePostJvm.gmk make/hotspot/lib/CompileDtracePreJvm.gmk make/hotspot/lib/CompileJvm.gmk make/hotspot/lib/JvmFlags.gmk make/hotspot/src/native/dtrace/generateJvmOffsets.h make/mapfiles/launchers/mapfile-ppc64 make/mapfiles/launchers/mapfile-ppc64.anonymous make/mapfiles/launchers/mapfile-sparc make/mapfiles/launchers/mapfile-sparcv9 make/mapfiles/launchers/mapfile-x86 make/mapfiles/launchers/mapfile-x86.anonymous make/mapfiles/launchers/mapfile-x86_64 make/mapfiles/launchers/mapfile-x86_64.anonymous make/mapfiles/libjsig/mapfile-vers-solaris make/mapfiles/libunpack/mapfile-vers-unpack200 make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-sparc make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-x86 make/mapfiles/libunpack/mapfile-vers-unpack200.anonymous src/java.base/linux/native/libjsig/jsig.c src/java.base/macosx/native/libjsig/jsig.c src/java.base/share/classes/java/time/format/ZoneName.java src/java.base/share/classes/sun/nio/cs/FastCharsetProvider.java src/java.base/solaris/native/libjsig/jsig.c test/jdk/java/lang/SecurityManager/DepMethodsRequireAllPerm.java test/jdk/java/nio/channels/SocketChannel/IsConnectable.java test/jdk/sun/security/mscapi/KeyStoreCompatibilityMode.sh test/jdk/sun/security/mscapi/KeytoolChangeAlias.sh test/jdk/sun/security/mscapi/PublicKeyInterop.sh test/jdk/sun/security/mscapi/RSAEncryptDecrypt.sh test/jdk/sun/security/mscapi/ShortRSAKey1024.sh test/jdk/sun/security/mscapi/SignUsingSHA2withRSA.sh test/jdk/sun/security/mscapi/nonUniqueAliases/NonUniqueAliases.sh test/tools/javac/importChecks/ImportCanonicalSameName/ImportCanonicalSameName.java test/tools/javac/importChecks/ImportCanonicalSameName/ImportCanonicalSameName.out test/tools/javac/importChecks/ImportCanonicalSameName/p1/A.java test/tools/javac/importChecks/ImportCanonicalSameName/p2/A.java
diffstat 676 files changed, 26342 insertions(+), 12711 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Mon Apr 09 11:10:52 2018 +0200
+++ b/.hgtags	Thu Apr 12 13:28:52 2018 -0700
@@ -477,3 +477,5 @@
 e59941f7247d451fa7df9eaef3fce0f492f8420c jdk-11+4
 d5c43e9f08fb9a7c74aae0d48daf17f2ad2afaef jdk-11+5
 3acb379b86725c47e7f33358cb22efa8752ae532 jdk-11+6
+f7363de371c9a1f668bd0a01b7df3d1ddb9cc58b jdk-11+7
+755e1b55a4dff510f9639cdb5c5e82549a7e09b3 jdk-11+8
--- a/make/CompileDemos.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/CompileDemos.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -242,6 +242,13 @@
     DEMO_SUBDIR := jfc, \
 ))
 
+$(eval $(call SetupBuildDemo, SwingSet2, \
+    DEMO_SUBDIR := jfc, \
+    EXTRA_COPY_TO_JAR := .java, \
+    EXTRA_MANIFEST_ATTR := SplashScreen-Image: resources/images/splash.png, \
+    DISABLE_SJAVAC := true, \
+))
+
 $(eval $(call SetupBuildDemo, Font2DTest, \
     DEMO_SUBDIR := jfc, \
 ))
--- a/make/CreateJmods.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/CreateJmods.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -80,10 +80,15 @@
   DEPS += $(call CacheFind, $(MAN_DIR))
 endif
 
+# If a specific modules_legal dir exists for this module, only pick up files
+# from there. These files were explicitly filtered or modified in <module>-copy
+# targets. For the rest, just pick up everything from the source legal dirs.
 LEGAL_NOTICES := \
-    $(call uniq, $(SUPPORT_OUTPUTDIR)/modules_legal/java.base \
-    $(call FindModuleLegalDirs, $(MODULE))) \
-    #
+    $(SUPPORT_OUTPUTDIR)/modules_legal/common \
+    $(if $(wildcard $(SUPPORT_OUTPUTDIR)/modules_legal/$(MODULE)), \
+      $(wildcard $(SUPPORT_OUTPUTDIR)/modules_legal/$(MODULE)), \
+      $(call FindModuleLegalSrcDirs, $(MODULE)) \
+    )
 
 LEGAL_NOTICES_PATH := $(call PathList, $(LEGAL_NOTICES))
 DEPS += $(call CacheFind, $(LEGAL_NOTICES))
@@ -112,6 +117,17 @@
           --hash-modules '^(?!$(EXCLUDE_PATTERN)$$)'
     endif
   endif
+else # not java.base
+  ifeq ($(OPENJDK_TARGET_OS), windows)
+    # Only java.base needs to include the MSVC*_DLLs. Make sure no other module
+    # tries to include them (typically imported ones).
+    ifneq ($(wildcard $(LIBS_DIR)/$(notdir $(MSVCR_DLL))), )
+      JMOD_FLAGS += --exclude '$(notdir $(MSVCR_DLL))'
+    endif
+    ifneq ($(wildcard $(LIBS_DIR)/$(notdir $(MSVCP_DLL))), )
+      JMOD_FLAGS += --exclude '$(notdir $(MSVCP_DLL))'
+    endif
+  endif
 endif
 
 # Changes to the jmod tool itself should also trigger a rebuild of all jmods.
@@ -128,18 +144,21 @@
   DEPS := $(filter-out $(SUPPORT_OUTPUTDIR)/modules_libs/java.base/classlist, $(DEPS))
 endif
 
+JMOD_FLAGS += --exclude '**{_the.*,_*.marker,*.diz,*.debuginfo,*.dSYM/**,*.dSYM,*.pdb,*.map}'
+
 # Create jmods in a temp dir and then move them into place to keep the
 # module path in $(IMAGES_OUTPUTDIR)/jmods valid at all times.
 $(JMODS_DIR)/$(MODULE).jmod: $(DEPS)
 	$(call LogWarn, Creating $(patsubst $(OUTPUTDIR)/%, %, $@))
 	$(call MakeDir, $(JMODS_DIR) $(JMODS_TEMPDIR))
 	$(RM) $@ $(JMODS_TEMPDIR)/$(notdir $@)
-	$(JMOD) create \
-            --module-version $(VERSION_SHORT) \
-            --target-platform '$(OPENJDK_MODULE_TARGET_PLATFORM)' \
-            --module-path $(JMODS_DIR) \
-	    --exclude '**{_the.*,_*.marker,*.diz,*.debuginfo,*.dSYM/**,*.dSYM,*.pdb,*.map}' \
-	    $(JMOD_FLAGS) $(JMODS_TEMPDIR)/$(notdir $@)
+	$(call ExecuteWithLog, $(SUPPORT_OUTPUTDIR)/jmods/$(MODULE).jmod, \
+	    $(JMOD) create \
+	        --module-version $(VERSION_SHORT) \
+	        --target-platform '$(OPENJDK_MODULE_TARGET_PLATFORM)' \
+	        --module-path $(JMODS_DIR) \
+	        $(JMOD_FLAGS) $(JMODS_TEMPDIR)/$(notdir $@) \
+	)
 	$(MV) $(JMODS_TEMPDIR)/$(notdir $@) $@
 
 TARGETS += $(JMODS_DIR)/$(MODULE).jmod
--- a/make/Docs.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/Docs.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -64,7 +64,7 @@
 JAVADOC_BASE_URL := http://www.oracle.com/pls/topic/lookup?ctx=javase10&amp;id=homepage
 BUG_SUBMIT_URL := http://bugreport.java.com/bugreport/
 COPYRIGHT_URL := {@docroot}/../legal/copyright.html
-LICENSE_URL := http://www.oracle.com/technetwork/java/javase/terms/license/java10speclicense.html
+LICENSE_URL := http://www.oracle.com/technetwork/java/javase/terms/license/java$(VERSION_NUMBER)speclicense.html
 REDISTRIBUTION_URL := http://www.oracle.com/technetwork/java/redist-137594.html
 
 # In order to get a specific ordering it's necessary to specify the total
--- a/make/Init.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/Init.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2018, 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
@@ -226,6 +226,15 @@
   # Parse COMPARE_BUILD (for makefile development)
   $(eval $(call ParseCompareBuild))
 
+  # If no LOG= was given on command line, but we have a non-standard default
+  # value, use that instead and re-parse log level.
+  ifeq ($(LOG), )
+    ifneq ($(DEFAULT_LOG), )
+      override LOG := $(DEFAULT_LOG)
+      $(eval $(call ParseLogLevel))
+    endif
+  endif
+
   ifeq ($(LOG_NOFILE), true)
     # Disable build log if LOG=[level,]nofile was given
     override BUILD_LOG_PIPE :=
--- a/make/InitSupport.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/InitSupport.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2018, 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
@@ -131,73 +131,6 @@
     endif
   endef
 
-  # Look for a given option in the LOG variable, and if found, set a variable
-  # and remove the option from the LOG variable
-  # $1: The option to look for
-  # $2: The option to set to "true" if the option is found
-  define ParseLogOption
-    ifneq ($$(findstring $1, $$(LOG)),)
-      $2 := true
-      # COMMA is defined in spec.gmk, but that is not included yet
-      COMMA := ,
-      # First try to remove ",<option>" if it exists, otherwise just remove "<option>"
-      LOG_STRIPPED := $$(subst $1,, $$(subst $$(COMMA)$(strip $1),, $$(LOG)))
-      # We might have ended up with a leading comma. Remove it. Need override
-      # since LOG is set from the command line.
-      override LOG := $$(strip $$(patsubst $$(COMMA)%, %, $$(LOG_STRIPPED)))
-    endif
-  endef
-
-  define ParseLogLevel
-    # Catch old-style VERBOSE= command lines.
-    ifneq ($$(origin VERBOSE), undefined)
-      $$(info Error: VERBOSE is deprecated. Use LOG=<warn|info|debug|trace> instead.)
-      $$(error Cannot continue)
-    endif
-
-    # Setup logging according to LOG
-
-    # If the "nofile" argument is given, act on it and strip it away
-    $$(eval $$(call ParseLogOption, nofile, LOG_NOFILE))
-
-    # If the "cmdline" argument is given, act on it and strip it away
-    $$(eval $$(call ParseLogOption, cmdlines, LOG_CMDLINES))
-
-    # If the "profile-to-log" argument is given, write shell times in build log
-    $$(eval $$(call ParseLogOption, profile-to-log, LOG_PROFILE_TIMES_LOG))
-
-    # If the "profile" argument is given, write shell times in separate log file
-    # IMPORTANT: $(ParseLogOption profile-to-log) should go first. Otherwise
-    # parsing of 'LOG=debug,profile-to-log,nofile' ends up in the following error:
-    # Error: LOG contains unknown option or log level: debug-to-log.
-    $$(eval $$(call ParseLogOption, profile, LOG_PROFILE_TIMES_FILE))
-
-    # Treat LOG=profile-to-log as if it were LOG=profile,profile-to-log
-    LOG_PROFILE_TIMES_FILE := $$(firstword $$(LOG_PROFILE_TIMES_FILE) $$(LOG_PROFILE_TIMES_LOG))
-
-    LOG_LEVEL := $$(LOG)
-
-    ifeq ($$(LOG_LEVEL),)
-      # Set LOG to "warn" as default if not set
-      LOG_LEVEL := warn
-    endif
-
-    ifeq ($$(LOG_LEVEL), warn)
-      MAKE_LOG_FLAGS := -s
-    else ifeq ($$(LOG_LEVEL), info)
-      MAKE_LOG_FLAGS := -s
-    else ifeq ($$(LOG_LEVEL), debug)
-      MAKE_LOG_FLAGS :=
-    else ifeq ($$(LOG_LEVEL), trace)
-      MAKE_LOG_FLAGS :=
-    else
-      $$(info Error: LOG contains unknown option or log level: $$(LOG).)
-      $$(info LOG can be <level>[,<opt>[...]] where <opt> is nofile | cmdlines | profile | profile-to-log)
-      $$(info and <level> is warn | info | debug | trace)
-      $$(error Cannot continue)
-    endif
-  endef
-
   define ParseConfAndSpec
     ifneq ($$(origin SPEC), undefined)
       # We have been given a SPEC, check that it works out properly
@@ -477,30 +410,38 @@
   endef
 
   define PrintFailureReports
-	$(if $(wildcard $(MAKESUPPORT_OUTPUTDIR)/failure-logs/*.log), \
-	  $(PRINTF) "\n=== Output from failing command(s) repeated here ===\n" $(NEWLINE) \
-	  $(foreach logfile, $(sort $(wildcard $(MAKESUPPORT_OUTPUTDIR)/failure-logs/*.log)), \
-	      $(PRINTF) "* For target $(notdir $(basename $(logfile))):\n" $(NEWLINE) \
-	      ($(GREP) -v -e "^Note: including file:" <  $(logfile) || true) | $(HEAD) -n 12 $(NEWLINE) \
-	      if test `$(WC) -l < $(logfile)` -gt 12; then \
-	        $(ECHO) "   ... (rest of output omitted)" ; \
-	      fi $(NEWLINE) \
+	$(if $(filter none, $(LOG_REPORT)), , \
+	  $(if $(wildcard $(MAKESUPPORT_OUTPUTDIR)/failure-logs/*.log), \
+	    $(PRINTF) "\n=== Output from failing command(s) repeated here ===\n" $(NEWLINE) \
+	    $(foreach logfile, $(sort $(wildcard $(MAKESUPPORT_OUTPUTDIR)/failure-logs/*.log)), \
+	        $(PRINTF) "* For target $(notdir $(basename $(logfile))):\n" $(NEWLINE) \
+	        $(if $(filter all, $(LOG_REPORT)), \
+	          $(GREP) -v -e "^Note: including file:" <  $(logfile) || true $(NEWLINE) \
+	        , \
+	          ($(GREP) -v -e "^Note: including file:" <  $(logfile) || true) | $(HEAD) -n 12 $(NEWLINE) \
+	          if test `$(WC) -l < $(logfile)` -gt 12; then \
+	            $(ECHO) "   ... (rest of output omitted)" ; \
+	          fi $(NEWLINE) \
+	        ) \
+	    ) \
+	    $(PRINTF) "\n* All command lines available in $(MAKESUPPORT_OUTPUTDIR)/failure-logs.\n" $(NEWLINE) \
+	    $(PRINTF) "=== End of repeated output ===\n" \
 	  ) \
-	  $(PRINTF) "\n* All command lines available in $(MAKESUPPORT_OUTPUTDIR)/failure-logs.\n" $(NEWLINE) \
-	  $(PRINTF) "=== End of repeated output ===\n" \
 	)
   endef
 
   define PrintBuildLogFailures
-	if $(GREP) -q "recipe for target .* failed" $(BUILD_LOG) 2> /dev/null; then  \
-	  $(PRINTF) "\n=== Make failed targets repeated here ===\n" ; \
-	  $(GREP) "recipe for target .* failed" $(BUILD_LOG) ; \
-	  $(PRINTF) "=== End of repeated output ===\n" ; \
-	  $(PRINTF) "\nHint: Try searching the build log for the name of the first failed target.\n" ; \
-	else \
-	  $(PRINTF) "\nNo indication of failed target found.\n" ; \
-	  $(PRINTF) "Hint: Try searching the build log for '] Error'.\n" ; \
-	fi
+	$(if $(filter none, $(LOG_REPORT)), , \
+	  if $(GREP) -q "recipe for target .* failed" $(BUILD_LOG) 2> /dev/null; then  \
+	    $(PRINTF) "\n=== Make failed targets repeated here ===\n" ; \
+	    $(GREP) "recipe for target .* failed" $(BUILD_LOG) ; \
+	    $(PRINTF) "=== End of repeated output ===\n" ; \
+	    $(PRINTF) "\nHint: Try searching the build log for the name of the first failed target.\n" ; \
+	  else \
+	    $(PRINTF) "\nNo indication of failed target found.\n" ; \
+	    $(PRINTF) "Hint: Try searching the build log for '] Error'.\n" ; \
+	  fi \
+	)
   endef
 
   define RotateLogFiles
@@ -583,8 +524,107 @@
 
 endif # HAS_SPEC
 
+# Look for a given option in the LOG variable, and if found, set a variable
+# and remove the option from the LOG variable
+# $1: The option to look for
+# $2: The variable to set to "true" if the option is found
+define ParseLogOption
+  ifneq ($$(findstring $1, $$(LOG)),)
+    override $2 := true
+    # COMMA is defined in spec.gmk, but that is not included yet
+    COMMA := ,
+    # First try to remove ",<option>" if it exists, otherwise just remove "<option>"
+    LOG_STRIPPED := $$(subst $1,, $$(subst $$(COMMA)$$(strip $1),, $$(LOG)))
+    # We might have ended up with a leading comma. Remove it. Need override
+    # since LOG is set from the command line.
+    override LOG := $$(strip $$(patsubst $$(COMMA)%, %, $$(LOG_STRIPPED)))
+  endif
+endef
+
+# Look for a given option with an assignment in the LOG variable, and if found,
+# set a variable to that value and remove the option from the LOG variable
+# $1: The option to look for
+# $2: The variable to set to the value of the option, if found
+define ParseLogValue
+  ifneq ($$(findstring $1=, $$(LOG)),)
+    # Make words of out comma-separated list and find the one with opt=val
+    value := $$(strip $$(subst $$(strip $1)=,, $$(filter $$(strip $1)=%, $$(subst $$(COMMA), , $$(LOG)))))
+    override $2 := $$(value)
+    # COMMA is defined in spec.gmk, but that is not included yet
+    COMMA := ,
+    # First try to remove ",<option>" if it exists, otherwise just remove "<option>"
+    LOG_STRIPPED := $$(subst $$(strip $1)=$$(value),, \
+        $$(subst $$(COMMA)$$(strip $1)=$$(value),, $$(LOG)))
+    # We might have ended up with a leading comma. Remove it. Need override
+    # since LOG is set from the command line.
+    override LOG := $$(strip $$(patsubst $$(COMMA)%, %, $$(LOG_STRIPPED)))
+  endif
+endef
+
+
+define ParseLogLevel
+  # Catch old-style VERBOSE= command lines.
+  ifneq ($$(origin VERBOSE), undefined)
+    $$(info Error: VERBOSE is deprecated. Use LOG=<warn|info|debug|trace> instead.)
+    $$(error Cannot continue)
+  endif
+
+  # Setup logging according to LOG
+
+  # If "nofile" is present, do not log to a file
+  $$(eval $$(call ParseLogOption, nofile, LOG_NOFILE))
+
+  # If "cmdline" is present, print all executes "important" command lines.
+  $$(eval $$(call ParseLogOption, cmdlines, LOG_CMDLINES))
+
+  # If "report" is present, use non-standard reporting options at build failure.
+  $$(eval $$(call ParseLogValue, report, LOG_REPORT))
+  ifneq ($$(LOG_REPORT), )
+    ifeq ($$(filter $$(LOG_REPORT), none all default), )
+      $$(info Error: LOG=report has invalid value: $$(LOG_REPORT).)
+      $$(info Valid values: LOG=report=<none>|<all>|<default>)
+      $$(error Cannot continue)
+    endif
+  endif
+
+  # If "profile-to-log" is present, write shell times in build log
+  $$(eval $$(call ParseLogOption, profile-to-log, LOG_PROFILE_TIMES_LOG))
+
+  # If "profile" is present, write shell times in separate log file
+  # IMPORTANT: $(ParseLogOption profile-to-log) should go first. Otherwise
+  # parsing of 'LOG=debug,profile-to-log,nofile' ends up in the following error:
+  # Error: LOG contains unknown option or log level: debug-to-log.
+  $$(eval $$(call ParseLogOption, profile, LOG_PROFILE_TIMES_FILE))
+
+  # Treat LOG=profile-to-log as if it were LOG=profile,profile-to-log
+  LOG_PROFILE_TIMES_FILE := $$(firstword $$(LOG_PROFILE_TIMES_FILE) $$(LOG_PROFILE_TIMES_LOG))
+
+  override LOG_LEVEL := $$(LOG)
+
+  ifeq ($$(LOG_LEVEL),)
+    # Set LOG to "warn" as default if not set
+    override LOG_LEVEL := warn
+  endif
+
+  ifeq ($$(LOG_LEVEL), warn)
+    override MAKE_LOG_FLAGS := -s
+  else ifeq ($$(LOG_LEVEL), info)
+    override MAKE_LOG_FLAGS := -s
+  else ifeq ($$(LOG_LEVEL), debug)
+    override MAKE_LOG_FLAGS :=
+  else ifeq ($$(LOG_LEVEL), trace)
+    override MAKE_LOG_FLAGS :=
+  else
+    $$(info Error: LOG contains unknown option or log level: $$(LOG).)
+    $$(info LOG can be <level>[,<opt>[...]] where <opt> is nofile | cmdlines | profile | profile-to-log)
+    $$(info and <level> is warn | info | debug | trace)
+    $$(error Cannot continue)
+  endif
+endef
+
 MAKE_LOG_VARS = $(foreach v, \
-    LOG_LEVEL LOG_NOFILE LOG_CMDLINES LOG_PROFILE_TIMES_LOG LOG_PROFILE_TIMES_FILE, \
+    LOG_LEVEL LOG_NOFILE LOG_CMDLINES LOG_REPORT LOG_PROFILE_TIMES_LOG \
+    LOG_PROFILE_TIMES_FILE, \
     $v=$($v) \
 )
 
--- a/make/autoconf/basics.m4	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/basics.m4	Thu Apr 12 13:28:52 2018 -0700
@@ -1260,6 +1260,24 @@
   AC_SUBST(DEFAULT_MAKE_TARGET)
 ])
 
+# Setup the default value for LOG=
+#
+AC_DEFUN_ONCE([BASIC_SETUP_DEFAULT_LOG],
+[
+  AC_ARG_WITH(log, [AS_HELP_STRING([--with-log],
+      [[default vaue for make LOG argument [warn]]])])
+  AC_MSG_CHECKING([for default LOG value])
+  if test "x$with_log" = x; then
+    DEFAULT_LOG=""
+  else
+    # Syntax for valid LOG options is a bit too complex for it to be worth
+    # implementing a test for correctness in configure. Just accept it.
+    DEFAULT_LOG=$with_log
+  fi
+  AC_MSG_RESULT([$DEFAULT_LOG])
+  AC_SUBST(DEFAULT_LOG)
+])
+
 # Code to run after AC_OUTPUT
 AC_DEFUN_ONCE([BASIC_POST_CONFIG_OUTPUT],
 [
--- a/make/autoconf/configure.ac	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/configure.ac	Thu Apr 12 13:28:52 2018 -0700
@@ -120,6 +120,7 @@
 
 # Misc basic settings
 BASIC_SETUP_DEFAULT_MAKE_TARGET
+BASIC_SETUP_DEFAULT_LOG
 
 ###############################################################################
 #
--- a/make/autoconf/flags-ldflags.m4	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/flags-ldflags.m4	Thu Apr 12 13:28:52 2018 -0700
@@ -81,7 +81,7 @@
 
   elif test "x$TOOLCHAIN_TYPE" = xclang; then
     BASIC_LDFLAGS_JVM_ONLY="-mno-omit-leaf-frame-pointer -mstack-alignment=16 \
-        -stdlib=libstdc++ -fPIC"
+        -stdlib=libc++ -fPIC"
 
   elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then
     BASIC_LDFLAGS="-Wl,-z,defs"
--- a/make/autoconf/flags.m4	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/flags.m4	Thu Apr 12 13:28:52 2018 -0700
@@ -116,7 +116,7 @@
     # of the OS. It currently has a hard coded value. Setting this also limits
     # exposure to API changes in header files. Bumping this is likely to
     # require code changes to build.
-    MACOSX_VERSION_MIN=10.7.0
+    MACOSX_VERSION_MIN=10.9.0
     MACOSX_VERSION_MIN_NODOTS=${MACOSX_VERSION_MIN//\./}
 
     AC_SUBST(MACOSX_VERSION_MIN)
@@ -241,7 +241,7 @@
        test "x$OPENJDK_TARGET_CPU" != xmips &&
        test "x$OPENJDK_TARGET_CPU" != xmipsel &&
        test "x$OPENJDK_TARGET_CPU" != xmips64 &&
-       test "x$OPENJDK_TARGET_CPU" != xmips64el; then 
+       test "x$OPENJDK_TARGET_CPU" != xmips64el; then
       MACHINE_FLAG="-m${OPENJDK_TARGET_CPU_BITS}"
     fi
   fi
@@ -325,22 +325,18 @@
 
   if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
     CC_OUT_OPTION=-Fo
-    EXE_OUT_OPTION=-out:
     LD_OUT_OPTION=-out:
     AR_OUT_OPTION=-out:
   else
     # The option used to specify the target .o,.a or .so file.
     # When compiling, how to specify the to be created object file.
     CC_OUT_OPTION='-o$(SPACE)'
-    # When linking, how to specify the to be created executable.
-    EXE_OUT_OPTION='-o$(SPACE)'
-    # When linking, how to specify the to be created dynamically linkable library.
+    # When linking, how to specify the output
     LD_OUT_OPTION='-o$(SPACE)'
     # When archiving, how to specify the to be create static archive for object files.
     AR_OUT_OPTION='rcs$(SPACE)'
   fi
   AC_SUBST(CC_OUT_OPTION)
-  AC_SUBST(EXE_OUT_OPTION)
   AC_SUBST(LD_OUT_OPTION)
   AC_SUBST(AR_OUT_OPTION)
 
--- a/make/autoconf/spec.gmk.in	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/spec.gmk.in	Thu Apr 12 13:28:52 2018 -0700
@@ -338,6 +338,7 @@
 
 # Default make target
 DEFAULT_MAKE_TARGET:=@DEFAULT_MAKE_TARGET@
+DEFAULT_LOG:=@DEFAULT_LOG@
 
 FREETYPE_TO_USE:=@FREETYPE_TO_USE@
 FREETYPE_LIBS:=@FREETYPE_LIBS@
@@ -401,7 +402,6 @@
 COMPILER_BINDCMD_FILE_FLAG:=@COMPILER_BINDCMD_FILE_FLAG@
 
 CC_OUT_OPTION:=@CC_OUT_OPTION@
-EXE_OUT_OPTION:=@EXE_OUT_OPTION@
 LD_OUT_OPTION:=@LD_OUT_OPTION@
 AR_OUT_OPTION:=@AR_OUT_OPTION@
 
@@ -466,11 +466,6 @@
 # Xcode SDK path
 SDKROOT:=@SDKROOT@
 
-# The linker on older SuSE distros (e.g. on SLES 10) complains with:
-# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
-# if feeded with a version script which contains named tags.
-USING_BROKEN_SUSE_LD:=@USING_BROKEN_SUSE_LD@
-
 # LDFLAGS used to link the jdk native libraries (C-code)
 LDFLAGS_JDKLIB:=@LDFLAGS_JDKLIB@
 JDKLIB_LIBS:=@JDKLIB_LIBS@
--- a/make/autoconf/toolchain.m4	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/toolchain.m4	Thu Apr 12 13:28:52 2018 -0700
@@ -597,8 +597,9 @@
 
     # solstudio cc requires us to have an existing file to pass as argument,
     # but it need not be a syntactically correct C file, so just use
-    # ourself. :)
-    LINKER_VERSION_STRING=`$LD -Wl,-V $TOPDIR/configure 2>&1 | $HEAD -n 1 | $SED -e 's/ld: //'`
+    # ourself. :) The intermediate 'cat' is needed to stop ld from leaving
+    # a lingering a.out (!).
+    LINKER_VERSION_STRING=`$LD -Wl,-V $TOPDIR/configure 2>&1 | $CAT | $HEAD -n 1 | $SED -e 's/ld: //'`
     # Extract version number
     [ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
         $SED -e 's/.* \([0-9][0-9]*\.[0-9][0-9]*\)-\([0-9][0-9]*\.[0-9][0-9]*\)/\1.\2/'` ]
@@ -1021,24 +1022,6 @@
     # This is later checked when setting flags.
   fi
 
-  # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed
-  # in executable.'
-  USING_BROKEN_SUSE_LD=no
-  if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$TOOLCHAIN_TYPE" = xgcc; then
-    AC_MSG_CHECKING([for broken SuSE 'ld' which only understands anonymous version tags in executables])
-    $ECHO "SUNWprivate_1.1 { local: *; };" > version-script.map
-    $ECHO "int main() { }" > main.c
-    if $CXX -Wl,-version-script=version-script.map main.c 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD; then
-      AC_MSG_RESULT(no)
-      USING_BROKEN_SUSE_LD=no
-    else
-      AC_MSG_RESULT(yes)
-      USING_BROKEN_SUSE_LD=yes
-    fi
-    $RM version-script.map main.c a.out
-  fi
-  AC_SUBST(USING_BROKEN_SUSE_LD)
-
   # Setup hotspot lecagy names for toolchains
   HOTSPOT_TOOLCHAIN_TYPE=$TOOLCHAIN_TYPE
   if test "x$TOOLCHAIN_TYPE" = xclang; then
--- a/make/autoconf/toolchain_windows.m4	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/toolchain_windows.m4	Thu Apr 12 13:28:52 2018 -0700
@@ -522,7 +522,6 @@
     if $ECHO "$MSVC_DLL_FILETYPE" | $GREP "$CORRECT_MSVCR_ARCH" 2>&1 > /dev/null; then
       AC_MSG_RESULT([ok])
       MSVC_DLL="$POSSIBLE_MSVC_DLL"
-      BASIC_FIXUP_PATH(MSVC_DLL)
       AC_MSG_CHECKING([for $DLL_NAME])
       AC_MSG_RESULT([$MSVC_DLL])
     else
--- a/make/autoconf/version-numbers	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/autoconf/version-numbers	Thu Apr 12 13:28:52 2018 -0700
@@ -29,7 +29,7 @@
 DEFAULT_VERSION_INTERIM=0
 DEFAULT_VERSION_UPDATE=0
 DEFAULT_VERSION_PATCH=0
-DEFAULT_VERSION_DATE=2018-09-18
+DEFAULT_VERSION_DATE=2018-09-25
 DEFAULT_VERSION_CLASSFILE_MAJOR=55  # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
 DEFAULT_VERSION_CLASSFILE_MINOR=0
 DEFAULT_ACCEPTABLE_BOOT_VERSIONS="9 10 11"
--- a/make/common/Modules.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/common/Modules.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -394,12 +394,11 @@
 endif
 LEGAL_SUBDIRS += share/legal
 
-# Find all legal dirs for a particular module
+# Find all legal src dirs for a particular module
 # $1 - Module to find legal dirs for
-FindModuleLegalDirs = \
+FindModuleLegalSrcDirs = \
     $(strip $(wildcard \
-        $(addsuffix /$(strip $1), $(SUPPORT_OUTPUTDIR)/modules_legal \
-            $(IMPORT_MODULES_LEGAL)) \
+        $(addsuffix /$(strip $1), $(IMPORT_MODULES_LEGAL)) \
         $(foreach sub, $(LEGAL_SUBDIRS), $(addsuffix /$(strip $1)/$(sub), $(TOP_SRC_DIRS))) \
     ))
 
--- a/make/common/NativeCompilation.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/common/NativeCompilation.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -292,13 +292,12 @@
     endif
 
     ifneq ($$(strip $$($1_CFLAGS) $$($1_CXXFLAGS) $$($1_OPTIMIZATION)), )
-      $1_VARDEPS := $$($1_CFLAGS) $$($1_CXXFLAGS) $$($1_OPT_CFLAGS) \
-          $$($1_OPT_CXXFLAGS)
+      $1_VARDEPS := $$($1_CFLAGS) $$($1_CXXFLAGS) $$($1_OPTIMIZATION)
       $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, $$($1_OBJ).vardeps)
     endif
 
     $$($1_OBJ): $$($1_SRC_FILE) $$($$($1_BASE)_COMPILE_VARDEPS_FILE) \
-        $$($1_VARDEPS_FILE) | $$($$($1_BASE)_BUILD_INFO)
+        $$($$($1_BASE)_EXTRA_DEPS) $$($1_VARDEPS_FILE) | $$($$($1_BASE)_BUILD_INFO)
 	$$(call LogInfo, Compiling $$($1_FILENAME) (for $$($$($1_BASE)_BASENAME)))
 	$$(call MakeDir, $$(@D))
         ifneq ($(TOOLCHAIN_TYPE), microsoft)
@@ -367,6 +366,7 @@
 #   EXCLUDE_PATTERN exclude files matching any of these substrings
 #   EXTRA_FILES List of extra files not in any of the SRC dirs
 #   EXTRA_OBJECT_FILES List of extra object files to include when linking
+#   EXTRA_DEPS List of extra dependencies to be added to each compiled file
 #   VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run
 #   RC_FLAGS flags for RC.
 #   EMBED_MANIFEST if true, embed manifest on Windows.
@@ -861,35 +861,71 @@
     endif
   endif
 
-  ifeq ($$($1_TYPE), LIBRARY)
-    # Generating a dynamic library.
-    $1_EXTRA_LDFLAGS += $$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
+  ifeq ($$($1_TYPE), STATIC_LIBRARY)
+    $1_VARDEPS := $$($1_AR) $$($1_ARFLAGS) $$($1_LIBS) \
+        $$($1_EXTRA_LIBS)
+    $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
+        $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
+
+    # Generating a static library, ie object file archive.
+    ifeq ($(STATIC_BUILD), true)
+      ifeq ($$($1_USE_MAPFILE_FOR_SYMBOLS), true)
+        STATIC_MAPFILE_DEP := $$($1_MAPFILE)
+      endif
+    endif
+
+    $$($1_TARGET): $$($1_ALL_OBJS) $$($1_RES) $$($1_VARDEPS_FILE) $$(STATIC_MAPFILE_DEP)
+	$$(call LogInfo, Building static library $$($1_BASENAME))
+	$$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_link, \
+	    $$($1_AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_ALL_OBJS) \
+	        $$($1_RES))
+        ifeq ($(STATIC_BUILD), true)
+          ifeq ($$($1_USE_MAPFILE_FOR_SYMBOLS), true)
+	    $(CP) $$($1_MAPFILE) $$(@D)/$$(basename $$(@F)).symbols
+          else
+	    $(GetSymbols)
+          endif
+        endif
+  else
+    # A shared dynamic library or an executable binary has been specified
+    ifeq ($$($1_TYPE), LIBRARY)
+      # Generating a dynamic library.
+      $1_EXTRA_LDFLAGS += $$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
+
+      # Create loadmap on AIX. Helps in diagnosing some problems.
+      ifneq ($(COMPILER_BINDCMD_FILE_FLAG), )
+        $1_EXTRA_LDFLAGS += $(COMPILER_BINDCMD_FILE_FLAG)$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).loadmap
+      endif
+    endif
+
     ifeq ($(OPENJDK_TARGET_OS), windows)
+      ifeq ($$($1_EMBED_MANIFEST), true)
+        $1_EXTRA_LDFLAGS += -manifest:embed
+      endif
+
       $1_IMPORT_LIBRARY := $$($1_OBJECT_DIR)/$$($1_NAME).lib
       $1_EXTRA_LDFLAGS += "-implib:$$($1_IMPORT_LIBRARY)"
-      # To properly trigger downstream dependants of the import library, just as
-      # for debug files, we must have a recipe in the rule. To avoid rerunning
-      # the recipe every time have it touch the target. If an import library
-      # file is deleted by something external, explicitly delete the target to
-      # trigger a rebuild of both.
-      ifneq ($$(wildcard $$($1_IMPORT_LIBRARY)), $$($1_IMPORT_LIBRARY))
-        $$(call LogDebug, Deleting $$($1_BASENAME) because import library is missing)
-        $$(shell $(RM) $$($1_TARGET))
-      endif
-      $$($1_IMPORT_LIBRARY): $$($1_TARGET)
+      ifeq ($$($1_TYPE), LIBRARY)
+        # To properly trigger downstream dependants of the import library, just as
+        # for debug files, we must have a recipe in the rule. To avoid rerunning
+        # the recipe every time have it touch the target. If an import library
+        # file is deleted by something external, explicitly delete the target to
+        # trigger a rebuild of both.
+        ifneq ($$(wildcard $$($1_IMPORT_LIBRARY)), $$($1_IMPORT_LIBRARY))
+          $$(call LogDebug, Deleting $$($1_BASENAME) because import library is missing)
+          $$(shell $(RM) $$($1_TARGET))
+        endif
+        $$($1_IMPORT_LIBRARY): $$($1_TARGET)
 		$$(if $$(CORRECT_FUNCTION_IN_RECIPE_EVALUATION), \
 		  $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<)) \
 		)
 		$(TOUCH) $$@
-    endif
-
-    # Create loadmap on AIX. Helps in diagnosing some problems.
-    ifneq ($(COMPILER_BINDCMD_FILE_FLAG), )
-      $1_EXTRA_LDFLAGS += $(COMPILER_BINDCMD_FILE_FLAG)$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).loadmap
+      endif
     endif
 
     $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \
-        $$(GLOBAL_LIBS) $$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_CREATE_DEBUGINFO_CMDS) \
+        $$(GLOBAL_LIBS) $$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_MT) \
+        $$($1_CODESIGN) $$($1_CREATE_DEBUGINFO_CMDS) $$($1_MANIFEST_VERSION) \
         $$($1_STRIP_CMD)
     $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
         $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
@@ -928,8 +964,8 @@
       endif
     endif
 
-    $$($1_TARGET): $$($1_ALL_OBJS) $$($1_RES) $$($1_REAL_MAPFILE) \
-        $$($1_VARDEPS_FILE)
+    $$($1_TARGET): $$($1_ALL_OBJS) $$($1_RES) $$($1_MANIFEST) \
+        $$($1_REAL_MAPFILE) $$($1_VARDEPS_FILE)
                 ifneq ($$($1_OBJ_FILE_LIST), )
                   ifeq ($$($1_LINK_OBJS_RELATIVE), true)
 		    $$(eval $$(call ListPathsSafely, $1_ALL_OBJS_RELATIVE, $$($1_OBJ_FILE_LIST)))
@@ -943,74 +979,21 @@
                 ifeq ($(OPENJDK_TARGET_OS), windows)
 		  $$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_link, \
 		      $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \
-		      $(LD_OUT_OPTION)$$@ $$($1_LD_OBJ_ARG) $$($1_RES) $$(GLOBAL_LIBS) \
-		      $$($1_LIBS) $$($1_EXTRA_LIBS)) \
+		          $(LD_OUT_OPTION)$$($1_TARGET) $$($1_LD_OBJ_ARG) $$($1_RES) $$(GLOBAL_LIBS) \
+		          $$($1_LIBS) $$($1_EXTRA_LIBS)) \
 		      | $(GREP) -v "^   Creating library .*\.lib and object .*\.exp" || \
-		      test "$$$$?" = "1" ; \
+		          test "$$$$?" = "1" ; \
 		  $$($1_CREATE_DEBUGINFO_CMDS)
 		  $$($1_STRIP_CMD)
                 else
 		  $$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_link, \
 		      $$(if $$($1_LINK_OBJS_RELATIVE), $$(CD) $$(OUTPUTDIR) ; ) \
 		      $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \
-		      $(LD_OUT_OPTION)$$@ $$($1_LD_OBJ_ARG) $$($1_RES) $$(GLOBAL_LIBS) \
-		      $$($1_LIBS) $$($1_EXTRA_LIBS)) ; \
+		          $(LD_OUT_OPTION)$$($1_TARGET) $$($1_LD_OBJ_ARG) $$($1_RES) $$(GLOBAL_LIBS) \
+		          $$($1_LIBS) $$($1_EXTRA_LIBS)) ; \
 		  $$($1_CREATE_DEBUGINFO_CMDS)
 		  $$($1_STRIP_CMD)
                 endif
-
-  endif
-
-  ifeq ($$($1_TYPE), STATIC_LIBRARY)
-    $1_VARDEPS := $$($1_AR) $$($1_ARFLAGS) $$($1_LIBS) \
-        $$($1_EXTRA_LIBS)
-    $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
-        $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
-
-    # Generating a static library, ie object file archive.
-    ifeq ($(STATIC_BUILD), true)
-      ifeq ($$($1_USE_MAPFILE_FOR_SYMBOLS), true)
-        STATIC_MAPFILE_DEP := $$($1_MAPFILE)
-      endif
-    endif
-
-    $$($1_TARGET): $$($1_ALL_OBJS) $$($1_RES) $$($1_VARDEPS_FILE) $$(STATIC_MAPFILE_DEP)
-	$$(call LogInfo, Building static library $$($1_BASENAME))
-	$$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_link, \
-	    $$($1_AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_ALL_OBJS) \
-	        $$($1_RES))
-        ifeq ($(STATIC_BUILD), true)
-          ifeq ($$($1_USE_MAPFILE_FOR_SYMBOLS), true)
-	    $(CP) $$($1_MAPFILE) $$(@D)/$$(basename $$(@F)).symbols
-          else
-	    $(GetSymbols)
-          endif
-        endif
-  endif
-
-  ifeq ($$($1_TYPE), EXECUTABLE)
-    # A executable binary has been specified, setup the target for it.
-    $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \
-        $$(GLOBAL_LIBS) $$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_MT) \
-        $$($1_CODESIGN) $$($1_CREATE_DEBUGINFO_CMDS) $$($1_MANIFEST_VERSION) \
-        $$($1_STRIP_CMD)
-    $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
-        $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
-
-    ifeq ($(OPENJDK_TARGET_OS), windows)
-      ifeq ($$($1_EMBED_MANIFEST), true)
-        $1_EXTRA_LDFLAGS += -manifest:embed
-      endif
-    endif
-
-    $$($1_TARGET): $$($1_ALL_OBJS) $$($1_RES) $$($1_MANIFEST) \
-        $$($1_VARDEPS_FILE)
-		$$(call LogInfo, Linking executable $$($1_BASENAME))
-		$$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_link, \
-		    $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \
-		        $(EXE_OUT_OPTION)$$($1_TARGET) \
-		        $$($1_ALL_OBJS) $$($1_RES) \
-		        $$(GLOBAL_LIBS) $$($1_LIBS) $$($1_EXTRA_LIBS))
                 ifeq ($(OPENJDK_TARGET_OS), windows)
                   ifneq ($$($1_MANIFEST), )
 		    $$($1_MT) -nologo -manifest $$($1_MANIFEST) -identity:"$$($1_NAME).exe, version=$$($1_MANIFEST_VERSION)" -outputresource:$$@;#1
@@ -1023,9 +1006,6 @@
 		    $(CODESIGN) -s openjdk_codesign $$@
                   endif
                 endif
-		$$($1_CREATE_DEBUGINFO_CMDS)
-		$$($1_STRIP_CMD)
-
   endif
 endef
 
--- a/make/conf/jib-profiles.js	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/conf/jib-profiles.js	Thu Apr 12 13:28:52 2018 -0700
@@ -446,7 +446,7 @@
             target_cpu: "x64",
             dependencies: ["devkit", "autoconf"],
             configure_args: concat(common.configure_args_64bit, "--with-zlib=system",
-                "--with-macosx-version-max=10.7.0"),
+                "--with-macosx-version-max=10.9.0"),
         },
 
         "solaris-x64": {
@@ -486,7 +486,7 @@
             build_cpu: "x64",
             dependencies: ["devkit", "autoconf", "build_devkit", "cups"],
             configure_args: [
-                "--openjdk-target=aarch64-linux-gnu"
+                "--openjdk-target=aarch64-linux-gnu", "--with-freetype=bundled",
             ],
         },
 
@@ -511,8 +511,10 @@
             configure_args: [
                 "--with-jvm-variants=minimal1,client",
                 "--with-x=" + input.get("devkit", "install_path") + "/arm-linux-gnueabihf/libc/usr/X11R6-PI",
+                "--with-fontconfig=" + input.get("devkit", "install_path") + "/arm-linux-gnueabihf/libc/usr/X11R6-PI",
                 "--openjdk-target=arm-linux-gnueabihf",
-                "--with-abi-profile=arm-vfp-hflt"
+                "--with-abi-profile=arm-vfp-hflt",
+                "--with-freetype=bundled"
             ],
         },
 
@@ -834,7 +836,7 @@
 var getJibProfilesDependencies = function (input, common) {
 
     var devkit_platform_revisions = {
-        linux_x64: "gcc4.9.2-OEL6.4+1.3",
+        linux_x64: "gcc7.3.0-OEL6.4+1.0",
         macosx_x64: "Xcode6.3-MacOSX10.9+1.0",
         solaris_x64: "SS12u4-Solaris11u1+1.0",
         solaris_sparcv9: "SS12u4-Solaris11u1+1.1",
--- a/make/copy/Copy-java.base.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/copy/Copy-java.base.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -24,6 +24,7 @@
 #
 
 include CopyCommon.gmk
+include Modules.gmk
 include TextFileProcessing.gmk
 
 $(eval $(call IncludeCustomExtension, copy/Copy-java.base.gmk))
@@ -224,13 +225,28 @@
 
 $(eval $(call SetupCopyFiles, COPY_JDK_NOTICES, \
     FILES := $(JDK_LICENSE) $(JDK_NOTICE) $(JDK_ADDITIONAL_LICENSE_INFO), \
-    DEST := $(LEGAL_DST_DIR), \
+    DEST := $(COMMON_LEGAL_DST_DIR), \
     FLATTEN := true, \
 ))
 
 TARGETS += $(COPY_JDK_NOTICES)
 
 ################################################################################
+#
+# Copy and filter the legal files depending on what 3rd party components are
+# bundled or linked from the OS.
+#
+ifeq ($(USE_EXTERNAL_LIBZ), true)
+  LEGAL_EXCLUDES += zlib.md
+endif
+
+$(eval $(call SetupCopyLegalFiles, COPY_LEGAL, \
+    EXCLUDES := $(LEGAL_EXCLUDES), \
+))
+
+TARGETS += $(COPY_LEGAL)
+
+################################################################################
 # Optionally copy libffi.so.? into the the image
 
 ifeq ($(ENABLE_LIBFFI_BUNDLING), true)
--- a/make/copy/Copy-java.desktop.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/copy/Copy-java.desktop.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -24,6 +24,7 @@
 #
 
 include CopyCommon.gmk
+include Modules.gmk
 
 $(eval $(call IncludeCustomExtension, copy/Copy-java.desktop.gmk))
 
@@ -48,3 +49,34 @@
 TARGETS += $(PSFONTPROPFILE_TARGET_FILES)
 
 ################################################################################
+#
+# Copy and filter the legal files depending on what 3rd party components are
+# bundled or linked from the OS.
+#
+ifeq ($(USE_EXTERNAL_LIBJPEG), true)
+  LEGAL_EXCLUDES += jpeg.md
+endif
+
+ifeq ($(USE_EXTERNAL_LIBGIF), true)
+  LEGAL_EXCLUDES += giflib.md
+endif
+
+ifeq ($(USE_EXTERNAL_LIBPNG), true)
+  LEGAL_EXCLUDES += libpng.md
+endif
+
+ifeq ($(USE_EXTERNAL_LCMS), true)
+  LEGAL_EXCLUDES += lcms.md
+endif
+
+ifeq ($(FREETYPE_TO_USE), system)
+  LEGAL_EXCLUDES += freetype.md
+endif
+
+$(eval $(call SetupCopyLegalFiles, COPY_LEGAL, \
+    EXCLUDES := $(LEGAL_EXCLUDES), \
+))
+
+TARGETS += $(COPY_LEGAL)
+
+################################################################################
--- a/make/copy/CopyCommon.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/copy/CopyCommon.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -26,6 +26,7 @@
 LIB_DST_DIR := $(SUPPORT_OUTPUTDIR)/modules_libs/$(MODULE)
 CONF_DST_DIR := $(SUPPORT_OUTPUTDIR)/modules_conf/$(MODULE)
 LEGAL_DST_DIR := $(SUPPORT_OUTPUTDIR)/modules_legal/$(MODULE)
+COMMON_LEGAL_DST_DIR := $(SUPPORT_OUTPUTDIR)/modules_legal/common
 
 ################################################################################
 #
@@ -60,3 +61,24 @@
 
   TARGETS += $(COPY_EXPORTED_INCLUDE_OS)
 endif
+
+################################################################################
+# Setup make rules for copying legal files. This is only needed if the files
+# need to be filtered due to optional components being enabled/disabled.
+# Otherwise CreateJmods.gmk will find the legal files in the original src dirs.
+#
+# Parameter 1 is the name of the rule.
+#
+# Remaining parameters are named arguments. These include:
+#   EXCLUDES : List of filenames to exclude from copy
+SetupCopyLegalFiles = $(NamedParamsMacroTemplate)
+define SetupCopyLegalFilesBody
+  $$(foreach f, $$(filter-out $$(addprefix %/, $$($1_EXCLUDES)), \
+      $$(wildcard $$(addsuffix /*, $$(call FindModuleLegalSrcDirs, $$(MODULE))))), \
+    $$(eval $$(call SetupCopyFiles, $1_$$(notdir $$f), \
+        DEST := $$(LEGAL_DST_DIR), \
+        FILES := $$f, \
+    )) \
+    $$(eval $1 += $$($1_$$(notdir $$f))) \
+  )
+endef
--- a/make/data/tzdata/VERSION	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/VERSION	Thu Apr 12 13:28:52 2018 -0700
@@ -21,4 +21,4 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-tzdata2018c
+tzdata2018d
--- a/make/data/tzdata/africa	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/africa	Thu Apr 12 13:28:52 2018 -0700
@@ -138,13 +138,13 @@
 
 # Cape Verde / Cabo Verde
 #
+# From Paul Eggert (2018-02-16):
 # Shanks gives 1907 for the transition to +02.
-# Perhaps the 1911-05-26 Portuguese decree
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# merely made it official?
+# For now, ignore that and follow the 1911-05-26 Portuguese decree
+# (see Europe/Lisbon).
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone Atlantic/Cape_Verde -1:34:04 -	LMT	1907        # Praia
+Zone Atlantic/Cape_Verde -1:34:04 -	LMT	1912 Jan 01  2:00u # Praia
 			-2:00	-	-02	1942 Sep
 			-2:00	1:00	-01	1945 Oct 15
 			-2:00	-	-02	1975 Nov 25  2:00
@@ -393,15 +393,34 @@
 # See Africa/Abidjan.
 
 # Ghana
+
+# From Paul Eggert (2018-01-30):
+# Whitman says DST was observed from 1931 to "the present";
+# Shanks & Pottenger say 1936 to 1942 with 20 minutes of DST,
+# with transitions on 09-01 and 12-31 at 00:00.
+# Page 33 of Parish GCB, Colonial Reports - Annual. No. 1066. Gold
+# Coast. Report for 1919. (March 1921), OCLC 784024077
+# http://libsysdigi.library.illinois.edu/ilharvest/africana/books2011-05/5530214/5530214_1919/5530214_1919_opt.pdf
+# lists the Determination of the Time Ordinance, 1919, No. 18,
+# "to advance the time observed locally by the space of twenty minutes
+# during the last four months of each year; the object in view being
+# to extend during those months the period of daylight-time available
+# for evening recreation after office hours."
+# Vanessa Ogle, The Global Transformation of Time, 1870-1950 (2015), p 33,
+# writes "In 1919, the Gold Coast (Ghana as of 1957) made Greenwich
+# time its legal time and simultaneously legalized a summer time of
+# UTC - 00:20 minutes from March to October."; a footnote lists
+# the ordinance as being dated 1919-11-24.
+# The Crown Colonist, Volume 12 (1942), p 176, says "the Government
+# intend advancing Gold Coast time half an hour ahead of G.M.T.
+# The actual date of the alteration has not yet been announced."
+# These sources are incomplete and contradictory.  Possibly what is
+# now Ghana observed different DST regimes in different years.  For
+# lack of better info, use Shanks except treat the minus sign as a
+# typo, and assume DST started in 1920 not 1936.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# Whitman says DST was observed from 1931 to "the present";
-# Shanks & Pottenger say 1936 to 1942;
-# and September 1 to January 1 is given by:
-# Scott Keltie J, Epstein M (eds), The Statesman's Year-Book,
-# 57th ed. Macmillan, London (1920), OCLC 609408015, pp xxviii.
-# For lack of better info, assume DST was observed from 1920 to 1942.
-Rule	Ghana	1920	1942	-	Sep	 1	0:00	0:20	GHST
-Rule	Ghana	1920	1942	-	Dec	31	0:00	0	GMT
+Rule	Ghana	1920	1942	-	Sep	 1	0:00	0:20	-
+Rule	Ghana	1920	1942	-	Dec	31	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Accra	-0:00:52 -	LMT	1918
 			 0:00	Ghana	GMT/+0020
@@ -411,13 +430,13 @@
 
 # Guinea-Bissau
 #
+# From Paul Eggert (2018-02-16):
 # Shanks gives 1911-05-26 for the transition to WAT,
 # evidently confusing the date of the Portuguese decree
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# with the date that it took effect, namely 1912-01-01.
+# (see Europe/Lisbon) with the date that it took effect.
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Bissau	-1:02:20 -	LMT	1912 Jan  1
+Zone	Africa/Bissau	-1:02:20 -	LMT	1912 Jan  1  1:00u
 			-1:00	-	-01	1975
 			 0:00	-	GMT
 
@@ -613,9 +632,9 @@
 # at 2am (or 02:00) local time..."
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule Mauritius	1982	only	-	Oct	10	0:00	1:00	S
+Rule Mauritius	1982	only	-	Oct	10	0:00	1:00	-
 Rule Mauritius	1983	only	-	Mar	21	0:00	0	-
-Rule Mauritius	2008	only	-	Oct	lastSun	2:00	1:00	S
+Rule Mauritius	2008	only	-	Oct	lastSun	2:00	1:00	-
 Rule Mauritius	2009	only	-	Mar	lastSun	2:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Indian/Mauritius	3:50:00 -	LMT	1907 # Port Louis
@@ -1060,6 +1079,8 @@
 
 # São Tomé and Príncipe
 
+# See Europe/Lisbon for info about the 1912 transition.
+
 # From Steffen Thorsen (2018-01-08):
 # Multiple sources tell that São Tomé changed from UTC to UTC+1 as
 # they entered the year 2018.
@@ -1068,7 +1089,7 @@
 # http://www.mnec.gov.st/index.php/publicacoes/documentos/file/90-decreto-lei-n-25-2017
 
 Zone	Africa/Sao_Tome	 0:26:56 -	LMT	1884
-			-0:36:45 -	LMT	1912 # Lisbon Mean Time
+			-0:36:45 -	LMT	1912 Jan  1 00:00u # Lisbon MT
 			 0:00	-	GMT	2018 Jan  1 01:00
 			 1:00	-	WAT
 
--- a/make/data/tzdata/antarctica	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/antarctica	Thu Apr 12 13:28:52 2018 -0700
@@ -98,7 +98,8 @@
 			8:00	-	+08	2011 Oct 28  2:00
 			11:00	-	+11	2012 Feb 21 17:00u
 			8:00	-	+08	2016 Oct 22
-			11:00	-	+11
+			11:00	-	+11	2018 Mar 11  4:00
+			8:00	-	+08
 Zone Antarctica/Davis	0	-	-00	1957 Jan 13
 			7:00	-	+07	1964 Nov
 			0	-	-00	1969 Feb
--- a/make/data/tzdata/asia	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/asia	Thu Apr 12 13:28:52 2018 -0700
@@ -92,13 +92,13 @@
 Rule	EUAsia	1981	max	-	Mar	lastSun	 1:00u	1:00	S
 Rule	EUAsia	1979	1995	-	Sep	lastSun	 1:00u	0	-
 Rule	EUAsia	1996	max	-	Oct	lastSun	 1:00u	0	-
-Rule E-EurAsia	1981	max	-	Mar	lastSun	 0:00	1:00	S
+Rule E-EurAsia	1981	max	-	Mar	lastSun	 0:00	1:00	-
 Rule E-EurAsia	1979	1995	-	Sep	lastSun	 0:00	0	-
 Rule E-EurAsia	1996	max	-	Oct	lastSun	 0:00	0	-
-Rule RussiaAsia	1981	1984	-	Apr	1	 0:00	1:00	S
+Rule RussiaAsia	1981	1984	-	Apr	1	 0:00	1:00	-
 Rule RussiaAsia	1981	1983	-	Oct	1	 0:00	0	-
 Rule RussiaAsia	1984	1995	-	Sep	lastSun	 2:00s	0	-
-Rule RussiaAsia	1985	2010	-	Mar	lastSun	 2:00s	1:00	S
+Rule RussiaAsia	1985	2010	-	Mar	lastSun	 2:00s	1:00	-
 Rule RussiaAsia	1996	2010	-	Oct	lastSun	 2:00s	0	-
 
 # Afghanistan
@@ -133,7 +133,7 @@
 # (brief)
 # http://www.worldtimezone.com/dst_news/dst_news_armenia03.html
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule Armenia	2011	only	-	Mar	lastSun	 2:00s	1:00	S
+Rule Armenia	2011	only	-	Mar	lastSun	 2:00s	1:00	-
 Rule Armenia	2011	only	-	Oct	lastSun	 2:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Yerevan	2:58:00 -	LMT	1924 May  2
@@ -159,7 +159,7 @@
 # http://en.apa.az/xeber_azerbaijan_abolishes_daylight_savings_ti_240862.html
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Azer	1997	2015	-	Mar	lastSun	 4:00	1:00	S
+Rule	Azer	1997	2015	-	Mar	lastSun	 4:00	1:00	-
 Rule	Azer	1997	2015	-	Oct	lastSun	 5:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Baku	3:19:24 -	LMT	1924 May  2
@@ -246,7 +246,7 @@
 # http://www.worldtimezone.com/dst_news/dst_news_bangladesh06.html
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Dhaka	2009	only	-	Jun	19	23:00	1:00	S
+Rule	Dhaka	2009	only	-	Jun	19	23:00	1:00	-
 Rule	Dhaka	2009	only	-	Dec	31	24:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -787,8 +787,9 @@
 Rule	Macau	1975	1977	-	Apr	Sun>=15	3:30	1:00	D
 Rule	Macau	1978	1980	-	Apr	Sun>=15	0:00	1:00	D
 Rule	Macau	1978	1980	-	Oct	Sun>=15	0:00	0	S
+# See Europe/Lisbon for info about the 1912 transition.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Asia/Macau	7:34:20 -	LMT	1912 Jan  1
+Zone	Asia/Macau	7:34:20 -	LMT	1911 Dec 31 16:00u
 			8:00	Macau	C%sT
 
 
@@ -1129,61 +1130,61 @@
 # thirtieth day of Shahrivar.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Iran	1978	1980	-	Mar	21	0:00	1:00	D
-Rule	Iran	1978	only	-	Oct	21	0:00	0	S
-Rule	Iran	1979	only	-	Sep	19	0:00	0	S
-Rule	Iran	1980	only	-	Sep	23	0:00	0	S
-Rule	Iran	1991	only	-	May	 3	0:00	1:00	D
-Rule	Iran	1992	1995	-	Mar	22	0:00	1:00	D
-Rule	Iran	1991	1995	-	Sep	22	0:00	0	S
-Rule	Iran	1996	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	1996	only	-	Sep	21	0:00	0	S
-Rule	Iran	1997	1999	-	Mar	22	0:00	1:00	D
-Rule	Iran	1997	1999	-	Sep	22	0:00	0	S
-Rule	Iran	2000	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	2000	only	-	Sep	21	0:00	0	S
-Rule	Iran	2001	2003	-	Mar	22	0:00	1:00	D
-Rule	Iran	2001	2003	-	Sep	22	0:00	0	S
-Rule	Iran	2004	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	2004	only	-	Sep	21	0:00	0	S
-Rule	Iran	2005	only	-	Mar	22	0:00	1:00	D
-Rule	Iran	2005	only	-	Sep	22	0:00	0	S
-Rule	Iran	2008	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	2008	only	-	Sep	21	0:00	0	S
-Rule	Iran	2009	2011	-	Mar	22	0:00	1:00	D
-Rule	Iran	2009	2011	-	Sep	22	0:00	0	S
-Rule	Iran	2012	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	2012	only	-	Sep	21	0:00	0	S
-Rule	Iran	2013	2015	-	Mar	22	0:00	1:00	D
-Rule	Iran	2013	2015	-	Sep	22	0:00	0	S
-Rule	Iran	2016	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	2016	only	-	Sep	21	0:00	0	S
-Rule	Iran	2017	2019	-	Mar	22	0:00	1:00	D
-Rule	Iran	2017	2019	-	Sep	22	0:00	0	S
-Rule	Iran	2020	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	2020	only	-	Sep	21	0:00	0	S
-Rule	Iran	2021	2023	-	Mar	22	0:00	1:00	D
-Rule	Iran	2021	2023	-	Sep	22	0:00	0	S
-Rule	Iran	2024	only	-	Mar	21	0:00	1:00	D
-Rule	Iran	2024	only	-	Sep	21	0:00	0	S
-Rule	Iran	2025	2027	-	Mar	22	0:00	1:00	D
-Rule	Iran	2025	2027	-	Sep	22	0:00	0	S
-Rule	Iran	2028	2029	-	Mar	21	0:00	1:00	D
-Rule	Iran	2028	2029	-	Sep	21	0:00	0	S
-Rule	Iran	2030	2031	-	Mar	22	0:00	1:00	D
-Rule	Iran	2030	2031	-	Sep	22	0:00	0	S
-Rule	Iran	2032	2033	-	Mar	21	0:00	1:00	D
-Rule	Iran	2032	2033	-	Sep	21	0:00	0	S
-Rule	Iran	2034	2035	-	Mar	22	0:00	1:00	D
-Rule	Iran	2034	2035	-	Sep	22	0:00	0	S
+Rule	Iran	1978	1980	-	Mar	21	0:00	1:00	-
+Rule	Iran	1978	only	-	Oct	21	0:00	0	-
+Rule	Iran	1979	only	-	Sep	19	0:00	0	-
+Rule	Iran	1980	only	-	Sep	23	0:00	0	-
+Rule	Iran	1991	only	-	May	 3	0:00	1:00	-
+Rule	Iran	1992	1995	-	Mar	22	0:00	1:00	-
+Rule	Iran	1991	1995	-	Sep	22	0:00	0	-
+Rule	Iran	1996	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	1996	only	-	Sep	21	0:00	0	-
+Rule	Iran	1997	1999	-	Mar	22	0:00	1:00	-
+Rule	Iran	1997	1999	-	Sep	22	0:00	0	-
+Rule	Iran	2000	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	2000	only	-	Sep	21	0:00	0	-
+Rule	Iran	2001	2003	-	Mar	22	0:00	1:00	-
+Rule	Iran	2001	2003	-	Sep	22	0:00	0	-
+Rule	Iran	2004	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	2004	only	-	Sep	21	0:00	0	-
+Rule	Iran	2005	only	-	Mar	22	0:00	1:00	-
+Rule	Iran	2005	only	-	Sep	22	0:00	0	-
+Rule	Iran	2008	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	2008	only	-	Sep	21	0:00	0	-
+Rule	Iran	2009	2011	-	Mar	22	0:00	1:00	-
+Rule	Iran	2009	2011	-	Sep	22	0:00	0	-
+Rule	Iran	2012	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	2012	only	-	Sep	21	0:00	0	-
+Rule	Iran	2013	2015	-	Mar	22	0:00	1:00	-
+Rule	Iran	2013	2015	-	Sep	22	0:00	0	-
+Rule	Iran	2016	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	2016	only	-	Sep	21	0:00	0	-
+Rule	Iran	2017	2019	-	Mar	22	0:00	1:00	-
+Rule	Iran	2017	2019	-	Sep	22	0:00	0	-
+Rule	Iran	2020	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	2020	only	-	Sep	21	0:00	0	-
+Rule	Iran	2021	2023	-	Mar	22	0:00	1:00	-
+Rule	Iran	2021	2023	-	Sep	22	0:00	0	-
+Rule	Iran	2024	only	-	Mar	21	0:00	1:00	-
+Rule	Iran	2024	only	-	Sep	21	0:00	0	-
+Rule	Iran	2025	2027	-	Mar	22	0:00	1:00	-
+Rule	Iran	2025	2027	-	Sep	22	0:00	0	-
+Rule	Iran	2028	2029	-	Mar	21	0:00	1:00	-
+Rule	Iran	2028	2029	-	Sep	21	0:00	0	-
+Rule	Iran	2030	2031	-	Mar	22	0:00	1:00	-
+Rule	Iran	2030	2031	-	Sep	22	0:00	0	-
+Rule	Iran	2032	2033	-	Mar	21	0:00	1:00	-
+Rule	Iran	2032	2033	-	Sep	21	0:00	0	-
+Rule	Iran	2034	2035	-	Mar	22	0:00	1:00	-
+Rule	Iran	2034	2035	-	Sep	22	0:00	0	-
 #
 # The following rules are approximations starting in the year 2038.
 # These are the best post-2037 approximations available, given the
 # restrictions of a single rule using a Gregorian-based data format.
 # At some point this table will need to be extended, though quite
 # possibly Iran will change the rules first.
-Rule	Iran	2036	max	-	Mar	21	0:00	1:00	D
-Rule	Iran	2036	max	-	Sep	21	0:00	0	S
+Rule	Iran	2036	max	-	Mar	21	0:00	1:00	-
+Rule	Iran	2036	max	-	Sep	21	0:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Tehran	3:25:44	-	LMT	1916
@@ -1219,17 +1220,17 @@
 # https://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Iraq	1982	only	-	May	1	0:00	1:00	D
-Rule	Iraq	1982	1984	-	Oct	1	0:00	0	S
-Rule	Iraq	1983	only	-	Mar	31	0:00	1:00	D
-Rule	Iraq	1984	1985	-	Apr	1	0:00	1:00	D
-Rule	Iraq	1985	1990	-	Sep	lastSun	1:00s	0	S
-Rule	Iraq	1986	1990	-	Mar	lastSun	1:00s	1:00	D
+Rule	Iraq	1982	only	-	May	1	0:00	1:00	-
+Rule	Iraq	1982	1984	-	Oct	1	0:00	0	-
+Rule	Iraq	1983	only	-	Mar	31	0:00	1:00	-
+Rule	Iraq	1984	1985	-	Apr	1	0:00	1:00	-
+Rule	Iraq	1985	1990	-	Sep	lastSun	1:00s	0	-
+Rule	Iraq	1986	1990	-	Mar	lastSun	1:00s	1:00	-
 # IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the ':01' is a typo.
 # Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
 #
-Rule	Iraq	1991	2007	-	Apr	 1	3:00s	1:00	D
-Rule	Iraq	1991	2007	-	Oct	 1	3:00s	0	S
+Rule	Iraq	1991	2007	-	Apr	 1	3:00s	1:00	-
+Rule	Iraq	1991	2007	-	Oct	 1	3:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Baghdad	2:57:40	-	LMT	1890
 			2:57:36	-	BMT	1918     # Baghdad Mean Time?
@@ -1501,8 +1502,7 @@
 
 # From Hideyuki Suzuki (1998-11-09):
 # 'Tokyo' usually stands for the former location of Tokyo Astronomical
-# Observatory: 139 degrees 44' 40.90" E (9h 18m 58.727s),
-# 35 degrees 39' 16.0" N.
+# Observatory: 139° 44' 40.90" E (9h 18m 58.727s), 35° 39' 16.0" N.
 # This data is from 'Rika Nenpyou (Chronological Scientific Tables) 1996'
 # edited by National Astronomical Observatory of Japan....
 # JST (Japan Standard Time) has been used since 1888-01-01 00:00 (JST).
@@ -1510,10 +1510,10 @@
 
 # From Hideyuki Suzuki (1998-11-16):
 # The ordinance No. 51 (1886) established "standard time" in Japan,
-# which stands for the time on 135 degrees E.
+# which stands for the time on 135° E.
 # In the ordinance No. 167 (1895), "standard time" was renamed to "central
 # standard time".  And the same ordinance also established "western standard
-# time", which stands for the time on 120 degrees E....  But "western standard
+# time", which stands for the time on 120° E....  But "western standard
 # time" was abolished in the ordinance No. 529 (1937).  In the ordinance No.
 # 167, there is no mention regarding for what place western standard time is
 # standard....
@@ -1926,9 +1926,9 @@
 # From 2005-08-12 our GMT-offset is +6, w/o any daylight saving.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Kyrgyz	1992	1996	-	Apr	Sun>=7	0:00s	1:00	S
+Rule	Kyrgyz	1992	1996	-	Apr	Sun>=7	0:00s	1:00	-
 Rule	Kyrgyz	1992	1996	-	Sep	lastSun	0:00	0	-
-Rule	Kyrgyz	1997	2005	-	Mar	lastSun	2:30	1:00	S
+Rule	Kyrgyz	1997	2005	-	Mar	lastSun	2:30	1:00	-
 Rule	Kyrgyz	1997	2004	-	Oct	lastSun	2:30	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Bishkek	4:58:24 -	LMT	1924 May  2
@@ -2060,7 +2060,7 @@
 
 # Malaysia
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	NBorneo	1935	1941	-	Sep	14	0:00	0:20	TS # one-Third Summer
+Rule	NBorneo	1935	1941	-	Sep	14	0:00	0:20	-
 Rule	NBorneo	1935	1941	-	Dec	14	0:00	0	-
 #
 # peninsular Malaysia
@@ -2205,7 +2205,7 @@
 # http://zasag.mn/news/view/8969
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Mongol	1983	1984	-	Apr	1	0:00	1:00	S
+Rule	Mongol	1983	1984	-	Apr	1	0:00	1:00	-
 Rule	Mongol	1983	only	-	Oct	1	0:00	0	-
 # Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00,
 # but McDow says the 2001 switches occurred at 02:00.  Also, IATA SSIM
@@ -2222,13 +2222,13 @@
 # Mongolian Government meeting has concluded today to cancel daylight
 # saving time adoption in Mongolia.  Source: http://zasag.mn/news/view/16192
 
-Rule	Mongol	1985	1998	-	Mar	lastSun	0:00	1:00	S
+Rule	Mongol	1985	1998	-	Mar	lastSun	0:00	1:00	-
 Rule	Mongol	1984	1998	-	Sep	lastSun	0:00	0	-
 # IATA SSIM (1999-09) says Mongolia no longer observes DST.
-Rule	Mongol	2001	only	-	Apr	lastSat	2:00	1:00	S
+Rule	Mongol	2001	only	-	Apr	lastSat	2:00	1:00	-
 Rule	Mongol	2001	2006	-	Sep	lastSat	2:00	0	-
-Rule	Mongol	2002	2006	-	Mar	lastSat	2:00	1:00	S
-Rule	Mongol	2015	2016	-	Mar	lastSat	2:00	1:00	S
+Rule	Mongol	2002	2006	-	Mar	lastSat	2:00	1:00	-
+Rule	Mongol	2015	2016	-	Mar	lastSat	2:00	1:00	-
 Rule	Mongol	2015	2016	-	Sep	lastSat	0:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -2662,9 +2662,6 @@
 # [Google translation]: "The Council also decided to start daylight
 # saving in Palestine as of one o'clock on Saturday morning,
 # 2016-03-26, to provide the clock 60 minutes ahead."
-#
-# From Paul Eggert (2016-03-12):
-# Predict spring transitions on March's last Saturday at 01:00 from now on.
 
 # From Sharef Mustafa (2016-10-19):
 # [T]he Palestinian cabinet decision (Mar 8th 2016) published on
@@ -2681,6 +2678,16 @@
 # https://www.timeanddate.com/time/change/gaza-strip/gaza
 # https://www.timeanddate.com/time/change/west-bank/hebron
 
+# From Sharef Mustafa (2018-03-16):
+# Palestine summer time will start on Mar 24th 2018 by advancing the
+# clock by 60 minutes as per Palestinian cabinet decision published on
+# the offical website, though the decree did not specify the exact
+# time of the time shift.
+# http://www.palestinecabinet.gov.ps/Website/AR/NDecrees/ViewFile.ashx?ID=e7a42ab7-ee23-435a-b9c8-a4f7e81f3817
+#
+# From Paul Eggert (2018-03-16):
+# For 2016 on, predict spring transitions on March's fourth Saturday at 01:00.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule EgyptAsia	1957	only	-	May	10	0:00	1:00	S
 Rule EgyptAsia	1957	1958	-	Oct	 1	0:00	0	-
@@ -2710,7 +2717,7 @@
 Rule Palestine	2013	only	-	Sep	Fri>=21	0:00	0	-
 Rule Palestine	2014	2015	-	Oct	Fri>=21	0:00	0	-
 Rule Palestine	2015	only	-	Mar	lastFri	24:00	1:00	S
-Rule Palestine	2016	max	-	Mar	lastSat	1:00	1:00	S
+Rule Palestine	2016	max	-	Mar	Sat>=22	1:00	1:00	S
 Rule Palestine	2016	max	-	Oct	lastSat	1:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -2760,11 +2767,11 @@
 # http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Phil	1936	only	-	Nov	1	0:00	1:00	S
+Rule	Phil	1936	only	-	Nov	1	0:00	1:00	-
 Rule	Phil	1937	only	-	Feb	1	0:00	0	-
-Rule	Phil	1954	only	-	Apr	12	0:00	1:00	S
+Rule	Phil	1954	only	-	Apr	12	0:00	1:00	-
 Rule	Phil	1954	only	-	Jul	1	0:00	0	-
-Rule	Phil	1978	only	-	Mar	22	0:00	1:00	S
+Rule	Phil	1978	only	-	Mar	22	0:00	1:00	-
 Rule	Phil	1978	only	-	Sep	21	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Manila	-15:56:00 -	LMT	1844 Dec 31
@@ -3120,9 +3127,9 @@
 # and is the basis for the information below.
 #
 # The 1906 transition was effective July 1 and standardized Indochina to
-# Phù Liễn Observatory, legally 104 deg. 17'17" east of Paris.
+# Phù Liễn Observatory, legally 104° 17' 17" east of Paris.
 # It's unclear whether this meant legal Paris Mean Time (00:09:21) or
-# the Paris Meridian (2 deg. 20'14.03" E); the former yields 07:06:30.1333...
+# the Paris Meridian (2° 20' 14.03" E); the former yields 07:06:30.1333...
 # and the latter 07:06:29.333... so either way it rounds to 07:06:30,
 # which is used below even though the modern-day Phù Liễn Observatory
 # is closer to 07:06:31.  Abbreviate Phù Liễn Mean Time as PLMT.
--- a/make/data/tzdata/australasia	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/australasia	Thu Apr 12 13:28:52 2018 -0700
@@ -219,20 +219,20 @@
 
 # Lord Howe Island
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	LH	1981	1984	-	Oct	lastSun	2:00	1:00	D
-Rule	LH	1982	1985	-	Mar	Sun>=1	2:00	0	S
-Rule	LH	1985	only	-	Oct	lastSun	2:00	0:30	D
-Rule	LH	1986	1989	-	Mar	Sun>=15	2:00	0	S
-Rule	LH	1986	only	-	Oct	19	2:00	0:30	D
-Rule	LH	1987	1999	-	Oct	lastSun	2:00	0:30	D
-Rule	LH	1990	1995	-	Mar	Sun>=1	2:00	0	S
-Rule	LH	1996	2005	-	Mar	lastSun	2:00	0	S
-Rule	LH	2000	only	-	Aug	lastSun	2:00	0:30	D
-Rule	LH	2001	2007	-	Oct	lastSun	2:00	0:30	D
-Rule	LH	2006	only	-	Apr	Sun>=1	2:00	0	S
-Rule	LH	2007	only	-	Mar	lastSun	2:00	0	S
-Rule	LH	2008	max	-	Apr	Sun>=1	2:00	0	S
-Rule	LH	2008	max	-	Oct	Sun>=1	2:00	0:30	D
+Rule	LH	1981	1984	-	Oct	lastSun	2:00	1:00	-
+Rule	LH	1982	1985	-	Mar	Sun>=1	2:00	0	-
+Rule	LH	1985	only	-	Oct	lastSun	2:00	0:30	-
+Rule	LH	1986	1989	-	Mar	Sun>=15	2:00	0	-
+Rule	LH	1986	only	-	Oct	19	2:00	0:30	-
+Rule	LH	1987	1999	-	Oct	lastSun	2:00	0:30	-
+Rule	LH	1990	1995	-	Mar	Sun>=1	2:00	0	-
+Rule	LH	1996	2005	-	Mar	lastSun	2:00	0	-
+Rule	LH	2000	only	-	Aug	lastSun	2:00	0:30	-
+Rule	LH	2001	2007	-	Oct	lastSun	2:00	0:30	-
+Rule	LH	2006	only	-	Apr	Sun>=1	2:00	0	-
+Rule	LH	2007	only	-	Mar	lastSun	2:00	0	-
+Rule	LH	2008	max	-	Apr	Sun>=1	2:00	0	-
+Rule	LH	2008	max	-	Oct	Sun>=1	2:00	0:30	-
 Zone Australia/Lord_Howe 10:36:20 -	LMT	1895 Feb
 			10:00	-	AEST	1981 Mar
 			10:30	LH	+1030/+1130 1985 Jul
@@ -390,15 +390,15 @@
 # practice than guessing no DST.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Fiji	1998	1999	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Fiji	1998	1999	-	Nov	Sun>=1	2:00	1:00	-
 Rule	Fiji	1999	2000	-	Feb	lastSun	3:00	0	-
-Rule	Fiji	2009	only	-	Nov	29	2:00	1:00	S
+Rule	Fiji	2009	only	-	Nov	29	2:00	1:00	-
 Rule	Fiji	2010	only	-	Mar	lastSun	3:00	0	-
-Rule	Fiji	2010	2013	-	Oct	Sun>=21	2:00	1:00	S
+Rule	Fiji	2010	2013	-	Oct	Sun>=21	2:00	1:00	-
 Rule	Fiji	2011	only	-	Mar	Sun>=1	3:00	0	-
 Rule	Fiji	2012	2013	-	Jan	Sun>=18	3:00	0	-
 Rule	Fiji	2014	only	-	Jan	Sun>=18	2:00	0	-
-Rule	Fiji	2014	max	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Fiji	2014	max	-	Nov	Sun>=1	2:00	1:00	-
 Rule	Fiji	2015	max	-	Jan	Sun>=14	3:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Pacific/Fiji	11:55:44 -	LMT	1915 Oct 26 # Suva
@@ -429,11 +429,11 @@
 			 12:00	-	+12
 Zone Pacific/Enderbury	-11:24:20 -	LMT	1901
 			-12:00	-	-12	1979 Oct
-			-11:00	-	-11	1995
+			-11:00	-	-11	1994 Dec 31
 			 13:00	-	+13
 Zone Pacific/Kiritimati	-10:29:20 -	LMT	1901
 			-10:40	-	-1040	1979 Oct
-			-10:00	-	-10	1995
+			-10:00	-	-10	1994 Dec 31
 			 14:00	-	+14
 
 # N Mariana Is
@@ -470,9 +470,9 @@
 
 # New Caledonia
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	NC	1977	1978	-	Dec	Sun>=1	0:00	1:00	S
+Rule	NC	1977	1978	-	Dec	Sun>=1	0:00	1:00	-
 Rule	NC	1978	1979	-	Feb	27	0:00	0	-
-Rule	NC	1996	only	-	Dec	 1	2:00s	1:00	S
+Rule	NC	1996	only	-	Dec	 1	2:00s	1:00	-
 # Shanks & Pottenger say the following was at 2:00; go with IATA.
 Rule	NC	1997	only	-	Mar	 2	2:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -492,27 +492,28 @@
 Rule	NZ	1934	1940	-	Apr	lastSun	2:00	0	M
 Rule	NZ	1934	1940	-	Sep	lastSun	2:00	0:30	S
 Rule	NZ	1946	only	-	Jan	 1	0:00	0	S
-# Since 1957 Chatham has been 45 minutes ahead of NZ, but there's no
-# convenient single notation for the date and time of this transition
-# so we must duplicate the Rule lines.
+# Since 1957 Chatham has been 45 minutes ahead of NZ, but until 2018a
+# there was no documented single notation for the date and time of this
+# transition.  Duplicate the Rule lines for now, to give the 2018a change
+# time to percolate out.
 Rule	NZ	1974	only	-	Nov	Sun>=1	2:00s	1:00	D
-Rule	Chatham	1974	only	-	Nov	Sun>=1	2:45s	1:00	D
+Rule	Chatham	1974	only	-	Nov	Sun>=1	2:45s	1:00	-
 Rule	NZ	1975	only	-	Feb	lastSun	2:00s	0	S
-Rule	Chatham	1975	only	-	Feb	lastSun	2:45s	0	S
+Rule	Chatham	1975	only	-	Feb	lastSun	2:45s	0	-
 Rule	NZ	1975	1988	-	Oct	lastSun	2:00s	1:00	D
-Rule	Chatham	1975	1988	-	Oct	lastSun	2:45s	1:00	D
+Rule	Chatham	1975	1988	-	Oct	lastSun	2:45s	1:00	-
 Rule	NZ	1976	1989	-	Mar	Sun>=1	2:00s	0	S
-Rule	Chatham	1976	1989	-	Mar	Sun>=1	2:45s	0	S
+Rule	Chatham	1976	1989	-	Mar	Sun>=1	2:45s	0	-
 Rule	NZ	1989	only	-	Oct	Sun>=8	2:00s	1:00	D
-Rule	Chatham	1989	only	-	Oct	Sun>=8	2:45s	1:00	D
+Rule	Chatham	1989	only	-	Oct	Sun>=8	2:45s	1:00	-
 Rule	NZ	1990	2006	-	Oct	Sun>=1	2:00s	1:00	D
-Rule	Chatham	1990	2006	-	Oct	Sun>=1	2:45s	1:00	D
+Rule	Chatham	1990	2006	-	Oct	Sun>=1	2:45s	1:00	-
 Rule	NZ	1990	2007	-	Mar	Sun>=15	2:00s	0	S
-Rule	Chatham	1990	2007	-	Mar	Sun>=15	2:45s	0	S
+Rule	Chatham	1990	2007	-	Mar	Sun>=15	2:45s	0	-
 Rule	NZ	2007	max	-	Sep	lastSun	2:00s	1:00	D
-Rule	Chatham	2007	max	-	Sep	lastSun	2:45s	1:00	D
+Rule	Chatham	2007	max	-	Sep	lastSun	2:45s	1:00	-
 Rule	NZ	2008	max	-	Apr	Sun>=1	2:00s	0	S
-Rule	Chatham	2008	max	-	Apr	Sun>=1	2:45s	0	S
+Rule	Chatham	2008	max	-	Apr	Sun>=1	2:45s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Pacific/Auckland	11:39:04 -	LMT	1868 Nov  2
 			11:30	NZ	NZ%sT	1946 Jan  1
@@ -536,9 +537,9 @@
 # Cook Is
 # From Shanks & Pottenger:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Cook	1978	only	-	Nov	12	0:00	0:30	HS
+Rule	Cook	1978	only	-	Nov	12	0:00	0:30	-
 Rule	Cook	1979	1991	-	Mar	Sun>=1	0:00	0	-
-Rule	Cook	1979	1990	-	Oct	lastSun	0:00	0:30	HS
+Rule	Cook	1979	1990	-	Oct	lastSun	0:00	0:30	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Pacific/Rarotonga	-10:39:04 -	LMT	1901        # Avarua
 			-10:30	-	-1030	1978 Nov 12
@@ -679,11 +680,11 @@
 # Assume the pattern instituted in 2012 will continue indefinitely.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	WS	2010	only	-	Sep	lastSun	0:00	1	D
-Rule	WS	2011	only	-	Apr	Sat>=1	4:00	0	S
-Rule	WS	2011	only	-	Sep	lastSat	3:00	1	D
-Rule	WS	2012	max	-	Apr	Sun>=1	4:00	0	S
-Rule	WS	2012	max	-	Sep	lastSun	3:00	1	D
+Rule	WS	2010	only	-	Sep	lastSun	0:00	1	-
+Rule	WS	2011	only	-	Apr	Sat>=1	4:00	0	-
+Rule	WS	2011	only	-	Sep	lastSat	3:00	1	-
+Rule	WS	2012	max	-	Apr	Sun>=1	4:00	0	-
+Rule	WS	2012	max	-	Sep	lastSun	3:00	1	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Pacific/Apia	 12:33:04 -	LMT	1892 Jul  5
 			-11:26:56 -	LMT	1911
@@ -723,11 +724,11 @@
 
 # Tonga
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Tonga	1999	only	-	Oct	 7	2:00s	1:00	S
+Rule	Tonga	1999	only	-	Oct	 7	2:00s	1:00	-
 Rule	Tonga	2000	only	-	Mar	19	2:00s	0	-
-Rule	Tonga	2000	2001	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Tonga	2000	2001	-	Nov	Sun>=1	2:00	1:00	-
 Rule	Tonga	2001	2002	-	Jan	lastSun	2:00	0	-
-Rule	Tonga	2016	only	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Tonga	2016	only	-	Nov	Sun>=1	2:00	1:00	-
 Rule	Tonga	2017	only	-	Jan	Sun>=15	3:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Pacific/Tongatapu	12:19:20 -	LMT	1901
@@ -804,12 +805,12 @@
 
 # Vanuatu
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Vanuatu	1983	only	-	Sep	25	0:00	1:00	S
+Rule	Vanuatu	1983	only	-	Sep	25	0:00	1:00	-
 Rule	Vanuatu	1984	1991	-	Mar	Sun>=23	0:00	0	-
-Rule	Vanuatu	1984	only	-	Oct	23	0:00	1:00	S
-Rule	Vanuatu	1985	1991	-	Sep	Sun>=23	0:00	1:00	S
+Rule	Vanuatu	1984	only	-	Oct	23	0:00	1:00	-
+Rule	Vanuatu	1985	1991	-	Sep	Sun>=23	0:00	1:00	-
 Rule	Vanuatu	1992	1993	-	Jan	Sun>=23	0:00	0	-
-Rule	Vanuatu	1992	only	-	Oct	Sun>=23	0:00	1:00	S
+Rule	Vanuatu	1992	only	-	Oct	Sun>=23	0:00	1:00	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Pacific/Efate	11:13:16 -	LMT	1912 Jan 13 # Vila
 			11:00	Vanuatu	+11/+12
@@ -1108,6 +1109,13 @@
 # South Australian time even though it's located in Western Australia.
 
 # Queensland
+
+# From Paul Eggert (2018-02-26):
+# I lack access to the following source for Queensland DST:
+# Pearce C. History of daylight saving time in Queensland.
+# Queensland Hist J. 2017 Aug;23(6):389-403
+# https://search.informit.com.au/documentSummary;dn=994682348436426;res=IELHSS
+
 # From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
 # #   The state of QUEENSLAND.. [ Courtesy Qld. Dept Premier Econ&Trade Devel ]
 # #						[ Dec 1990 ]
@@ -1534,6 +1542,12 @@
 # "declared it the same day [throughout] the country as of Jan. 1, 1995"
 # as part of the competition to be first into the 21st century.
 
+# From Kerry Shetline (2018-02-03):
+# December 31 was the day that was skipped, so that the transition
+# would be from Friday December 30, 1994 to Sunday January 1, 1995.
+# From Paul Eggert (2018-02-04):
+# One source for this is page 202 of: Bartky IR. One Time Fits All:
+# The Campaigns for Global Uniformity (2007).
 
 # Kwajalein
 
@@ -1626,7 +1640,7 @@
 
 # From Howie Phelps (1999-11-10), who talked to a Pitcairner via shortwave:
 # Betty Christian told me yesterday that their local time is the same as
-# Pacific Standard Time. They used to be 1/2 hour different from us here in
+# Pacific Standard Time. They used to be ½ hour different from us here in
 # Sacramento but it was changed a couple of years ago.
 
 
@@ -1665,7 +1679,7 @@
 # 12 hours and 20 minutes ahead of GMT.  When New Zealand adjusted its
 # standard time in 1940s, Tonga had the choice of subtracting from its
 # local time to come on the same standard time as New Zealand or of
-# advancing its time to maintain the differential of 13 degrees
+# advancing its time to maintain the differential of 13°
 # (approximately 50 minutes ahead of New Zealand time).
 #
 # Because His Majesty King Tāufaʻāhau Tupou IV, then Crown Prince
--- a/make/data/tzdata/europe	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/europe	Thu Apr 12 13:28:52 2018 -0700
@@ -140,8 +140,8 @@
 # along the towpath within a few yards of it.'
 #
 # I have a one inch to one mile map of London and my estimate of the stone's
-# position is 51 degrees 28' 30" N, 0 degrees 18' 45" W. The longitude should
-# be within about +-2". The Ordnance Survey grid reference is TQ172761.
+# position is 51° 28' 30" N, 0° 18' 45" W. The longitude should
+# be within about ±2". The Ordnance Survey grid reference is TQ172761.
 #
 # [This yields GMTOFF = -0:01:15 for London LMT in the 18th century.]
 
@@ -181,7 +181,7 @@
 # after-hours daylight in which to pursue his research.
 # In 1895 he presented a paper to the Wellington Philosophical Society
 # that proposed a two-hour daylight-saving shift.  See:
-# Hudson GV. On seasonal time-adjustment in countries south of lat. 30 deg.
+# Hudson GV. On seasonal time-adjustment in countries south of lat. 30°.
 # Transactions and Proceedings of the New Zealand Institute. 1895;28:734
 # http://rsnz.natlib.govt.nz/volume/rsnz_28/rsnz_28_00_006110.html
 # Although some interest was expressed in New Zealand, his proposal
@@ -531,11 +531,25 @@
 Link	Europe/London	Europe/Guernsey
 Link	Europe/London	Europe/Isle_of_Man
 
-# From Paul Eggert (2018-01-19):
+# From Paul Eggert (2018-02-15):
+# In January 2018 we discovered that the negative SAVE values in the
+# Eire rules cause problems with tests for ICU:
+# https://mm.icann.org/pipermail/tz/2018-January/025825.html
+# and with tests for OpenJDK:
+# https://mm.icann.org/pipermail/tz/2018-January/025822.html
+#
+# To work around this problem, the build procedure can translate the
+# following data into two forms, one with negative SAVE values and the
+# other form with a traditional approximation for Irish time stamps
+# after 1971-10-31 02:00 UTC; although this approximation has tm_isdst
+# flags that are reversed, its UTC offsets are correct and this often
+# suffices.  This source file currently uses only nonnegative SAVE
+# values, but this is intended to change and downstream code should
+# not rely on it.
+#
 # The following is like GB-Eire and EU, except with standard time in
-# summer and negative daylight saving time in winter.
-# Although currently commented out, this will need to become uncommented
-# once the ICU/OpenJDK workaround is removed; see below.
+# summer and negative daylight saving time in winter.  It is for when
+# negative SAVE values are used.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 #Rule	Eire	1971	only	-	Oct	31	 2:00u	-1:00	GMT
 #Rule	Eire	1972	1980	-	Mar	Sun>=16	 2:00u	0	IST
@@ -556,24 +570,12 @@
 			 0:00	1:00	IST	1947 Nov  2  2:00s
 			 0:00	-	GMT	1948 Apr 18  2:00s
 			 0:00	GB-Eire	GMT/IST	1968 Oct 27
-# From Paul Eggert (2018-01-18):
-# The next line should look like this:
+# The next line is for when negative SAVE values are used.
 #			 1:00	Eire	IST/GMT
-# However, in January 2018 we discovered that the Eire rules cause
-# problems with tests for ICU:
-# https://mm.icann.org/pipermail/tz/2018-January/025825.html
-# and with tests for OpenJDK:
-# https://mm.icann.org/pipermail/tz/2018-January/025822.html
-# To work around this problem, use a traditional approximation for
-# time stamps after 1971-10-31 02:00 UTC, to give ICU and OpenJDK
-# developers breathing room to fix bugs.  This approximation has
-# correct UTC offsets, but results in tm_isdst flags are the reverse
-# of what they should be.  This workaround is temporary and should be
-# removed reasonably soon.
+# These three lines are for when SAVE values are always nonnegative.
 			 1:00	-	IST	1971 Oct 31  2:00u
 			 0:00	GB-Eire	GMT/IST	1996
 			 0:00	EU	GMT/IST
-# End of workaround for ICU and OpenJDK bugs.
 
 
 ###############################################################################
@@ -1557,21 +1559,21 @@
 # http://www.almanak.hi.is/klukkan.html
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Iceland	1917	1919	-	Feb	19	23:00	1:00	S
+Rule	Iceland	1917	1919	-	Feb	19	23:00	1:00	-
 Rule	Iceland	1917	only	-	Oct	21	 1:00	0	-
 Rule	Iceland	1918	1919	-	Nov	16	 1:00	0	-
-Rule	Iceland	1921	only	-	Mar	19	23:00	1:00	S
+Rule	Iceland	1921	only	-	Mar	19	23:00	1:00	-
 Rule	Iceland	1921	only	-	Jun	23	 1:00	0	-
-Rule	Iceland	1939	only	-	Apr	29	23:00	1:00	S
+Rule	Iceland	1939	only	-	Apr	29	23:00	1:00	-
 Rule	Iceland	1939	only	-	Oct	29	 2:00	0	-
-Rule	Iceland	1940	only	-	Feb	25	 2:00	1:00	S
+Rule	Iceland	1940	only	-	Feb	25	 2:00	1:00	-
 Rule	Iceland	1940	1941	-	Nov	Sun>=2	 1:00s	0	-
-Rule	Iceland	1941	1942	-	Mar	Sun>=2	 1:00s	1:00	S
+Rule	Iceland	1941	1942	-	Mar	Sun>=2	 1:00s	1:00	-
 # 1943-1946 - first Sunday in March until first Sunday in winter
-Rule	Iceland	1943	1946	-	Mar	Sun>=1	 1:00s	1:00	S
+Rule	Iceland	1943	1946	-	Mar	Sun>=1	 1:00s	1:00	-
 Rule	Iceland	1942	1948	-	Oct	Sun>=22	 1:00s	0	-
 # 1947-1967 - first Sunday in April until first Sunday in winter
-Rule	Iceland	1947	1967	-	Apr	Sun>=1	 1:00s	1:00	S
+Rule	Iceland	1947	1967	-	Apr	Sun>=1	 1:00s	1:00	-
 # 1949 and 1967 Oct transitions delayed by 1 week
 Rule	Iceland	1949	only	-	Oct	30	 1:00s	0	-
 Rule	Iceland	1950	1966	-	Oct	Sun>=22	 1:00s	0	-
@@ -2161,15 +2163,19 @@
 			1:00	EU	CE%sT
 
 # Portugal
-#
+
 # From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne:
 # According to a Portuguese decree (1911-05-26)
 # https://dre.pt/application/dir/pdf1sdip/1911/05/12500/23132313.pdf
 # Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00.
-# Round the old offset to -0:36:45.  This agrees with Willett but disagrees
-# with Shanks, who says the transition occurred on 1911-05-24 at 00:00 for
-# Europe/Lisbon, Atlantic/Azores, and Atlantic/Madeira.
+# Round the old offset to -0:36:45.  This agrees with Willett....
 #
+# From Michael Deckers (2018-02-15):
+# article 5 [of the 1911 decree; Deckers's translation] ...:
+# These dispositions shall enter into force at the instant at which,
+# according to the 2nd article, the civil day January 1, 1912 begins,
+# all clocks therefore having to be advanced or set back correspondingly ...
+
 # From Rui Pedro Salgueiro (1992-11-12):
 # Portugal has recently (September, 27) changed timezone
 # (from WET to MET or CET) to harmonize with EEC.
@@ -2252,7 +2258,7 @@
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Lisbon	-0:36:45 -	LMT	1884
-			-0:36:45 -	LMT	1912 Jan  1 # Lisbon Mean Time
+			-0:36:45 -	LMT	1912 Jan  1  0:00u # Lisbon MT
 			 0:00	Port	WE%sT	1966 Apr  3  2:00
 			 1:00	-	CET	1976 Sep 26  1:00
 			 0:00	Port	WE%sT	1983 Sep 25  1:00s
@@ -2261,7 +2267,7 @@
 			 0:00	EU	WE%sT
 # This Zone can be simplified once we assume zic %z.
 Zone Atlantic/Azores	-1:42:40 -	LMT	1884        # Ponta Delgada
-			-1:54:32 -	HMT	1912 Jan  1 # Horta Mean Time
+			-1:54:32 -	HMT	1912 Jan  1  2:00u # Horta MT
 			-2:00	Port	-02/-01	1942 Apr 25 22:00s
 			-2:00	Port	+00	1942 Aug 15 22:00s
 			-2:00	Port	-02/-01	1943 Apr 17 22:00s
@@ -2277,7 +2283,7 @@
 			-1:00	EU	-01/+00
 # This Zone can be simplified once we assume zic %z.
 Zone Atlantic/Madeira	-1:07:36 -	LMT	1884        # Funchal
-			-1:07:36 -	FMT	1912 Jan  1 # Funchal Mean Time
+			-1:07:36 -	FMT	1912 Jan  1  1:00u # Funchal MT
 			-1:00	Port	-01/+00	1942 Apr 25 22:00s
 			-1:00	Port	+01	1942 Aug 15 22:00s
 			-1:00	Port	-01/+00	1943 Apr 17 22:00s
@@ -2615,13 +2621,13 @@
 
 # From Vladimir Karpinsky (2014-07-08):
 # LMT in Moscow (before Jul 3, 1916) is 2:30:17, that was defined by Moscow
-# Observatory (coordinates: 55 deg. 45'29.70", 37 deg. 34'05.30")....
+# Observatory (coordinates: 55° 45' 29.70", 37° 34' 05.30")....
 # LMT in Moscow since Jul 3, 1916 is 2:31:01 as a result of new standard.
 # (The info is from the book by Byalokoz ... p. 18.)
 # The time in St. Petersburg as capital of Russia was defined by
 # Pulkov observatory, near St. Petersburg.  In 1916 LMT Moscow
 # was synchronized with LMT St. Petersburg (+30 minutes), (Pulkov observatory
-# coordinates: 59 deg. 46'18.70", 30 deg. 19'40.70") so 30 deg. 19'40.70" >
+# coordinates: 59° 46' 18.70", 30° 19' 40.70") so 30° 19' 40.70" >
 # 2h01m18.7s = 2:01:19.  LMT Moscow = LMT St.Petersburg + 30m 2:01:19 + 0:30 =
 # 2:31:19 ...
 #
@@ -3450,7 +3456,7 @@
 # three degrees, or twelve minutes of time, to the west of the
 # meridian of the Observatory of Stockholm".  The law is dated 1878-05-31.
 #
-# The observatory at that time had the meridian 18 degrees 03' 30"
+# The observatory at that time had the meridian 18° 03' 30"
 # eastern longitude = 01:12:14 in time.  Less 12 minutes gives the
 # national standard time as 01:00:14 ahead of GMT....
 #
@@ -3554,7 +3560,7 @@
 # From Alois Treindl (2013-09-11):
 # The Federal regulations say
 # https://www.admin.ch/opc/de/classified-compilation/20071096/index.html
-# ... the meridian for Bern mean time ... is 7 degrees 26' 22.50".
+# ... the meridian for Bern mean time ... is 7° 26' 22.50".
 # Expressed in time, it is 0h29m45.5s.
 
 # From Pierre-Yves Berger (2013-09-11):
--- a/make/data/tzdata/northamerica	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/northamerica	Thu Apr 12 13:28:52 2018 -0700
@@ -48,7 +48,7 @@
 # in New York City (1869-10).  His 1870 proposal was based on Washington, DC,
 # but in 1872-05 he moved the proposed origin to Greenwich.
 
-# From Paul Eggert (2016-09-21):
+# From Paul Eggert (2018-03-20):
 # Dowd's proposal left many details unresolved, such as where to draw
 # lines between time zones.  The key individual who made time zones
 # work in the US was William Frederick Allen - railway engineer,
@@ -59,10 +59,9 @@
 # to the General Time Convention on 1883-04-11, saying that his plan
 # meant "local time would be practically abolished" - a plus for
 # railway scheduling.  By the next convention on 1883-10-11 nearly all
-# railroads had agreed and it took effect on 1883-11-18 at 12:00.
-# That Sunday was called the "day of two noons", as the eastern parts
-# of the new zones observed noon twice.  Allen witnessed the
-# transition in New York City, writing:
+# railroads had agreed and it took effect on 1883-11-18.  That Sunday
+# was called the "day of two noons", as some locations observed noon
+# twice.  Allen witnessed the transition in New York City, writing:
 #
 #   I heard the bells of St. Paul's strike on the old time.  Four
 #   minutes later, obedient to the electrical signal from the Naval
@@ -447,8 +446,7 @@
 # ...according to the Census Bureau, the largest city is Beulah (although
 # it's commonly referred to as Beulah-Hazen, with Hazen being the next
 # largest city in Mercer County).  Google Maps places Beulah's city hall
-# at 47 degrees 15' 51" N, 101 degrees 46' 40" W, which yields an offset
-# of 6h47'07".
+# at 47° 15' 51" N, 101° 46' 40" W, which yields an offset of 6h47'07".
 
 Zone America/North_Dakota/Beulah -6:47:07 - LMT	1883 Nov 18 12:12:53
 			-7:00	US	M%sT	2010 Nov  7  2:00
@@ -481,7 +479,7 @@
 # California, northern Idaho (Benewah, Bonner, Boundary, Clearwater,
 # Kootenai, Latah, Lewis, Nez Perce, and Shoshone counties, Idaho county
 # north of the Salmon River, and the towns of Burgdorf and Warren),
-# Nevada (except West Wendover), Oregon (except the northern 3/4 of
+# Nevada (except West Wendover), Oregon (except the northern ¾ of
 # Malheur county), and Washington
 
 # From Paul Eggert (2016-08-20):
@@ -979,6 +977,13 @@
 			-5:00	-	EST	2006
 			-5:00	US	E%sT
 
+# From Paul Eggert (2018-03-20):
+# The Louisville & Nashville Railroad's 1883-11-18 change occurred at
+# 10:00 old local time; train were supposed to come to a standstill
+# for precisely 18 minutes.  See Bartky Fig. 1 (page 50).  It is not
+# clear how this matched civil time in Louisville, so for now continue
+# to assume Louisville switched at noon new local time, like New York.
+#
 # Part of Kentucky left its clocks alone in 1974.
 # This also includes Clark, Floyd, and Harrison counties in Indiana.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
@@ -3287,8 +3292,8 @@
 # http://www.jamaicaobserver.com/columns/The-politician-in-all-of-us_17573647
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	America/Jamaica	-5:07:11 -	LMT	1890        # Kingston
-			-5:07:11 -	KMT	1912 Feb    # Kingston Mean Time
+Zone	America/Jamaica	-5:07:10 -	LMT	1890        # Kingston
+			-5:07:10 -	KMT	1912 Feb    # Kingston Mean Time
 			-5:00	-	EST	1974
 			-5:00	US	E%sT	1984
 			-5:00	-	EST
@@ -3438,7 +3443,7 @@
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Grand_Turk	-4:44:32 -	LMT	1890
-			-5:07:11 -	KMT	1912 Feb # Kingston Mean Time
+			-5:07:10 -	KMT	1912 Feb # Kingston Mean Time
 			-5:00	-	EST	1979
 			-5:00	US	E%sT	2015 Nov Sun>=1 2:00
 			-4:00	-	AST	2018 Mar 11 3:00
--- a/make/data/tzdata/southamerica	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/southamerica	Thu Apr 12 13:28:52 2018 -0700
@@ -70,28 +70,28 @@
 # AR was chosen because they are the ISO letters that represent Argentina.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Arg	1930	only	-	Dec	 1	0:00	1:00	S
+Rule	Arg	1930	only	-	Dec	 1	0:00	1:00	-
 Rule	Arg	1931	only	-	Apr	 1	0:00	0	-
-Rule	Arg	1931	only	-	Oct	15	0:00	1:00	S
+Rule	Arg	1931	only	-	Oct	15	0:00	1:00	-
 Rule	Arg	1932	1940	-	Mar	 1	0:00	0	-
-Rule	Arg	1932	1939	-	Nov	 1	0:00	1:00	S
-Rule	Arg	1940	only	-	Jul	 1	0:00	1:00	S
+Rule	Arg	1932	1939	-	Nov	 1	0:00	1:00	-
+Rule	Arg	1940	only	-	Jul	 1	0:00	1:00	-
 Rule	Arg	1941	only	-	Jun	15	0:00	0	-
-Rule	Arg	1941	only	-	Oct	15	0:00	1:00	S
+Rule	Arg	1941	only	-	Oct	15	0:00	1:00	-
 Rule	Arg	1943	only	-	Aug	 1	0:00	0	-
-Rule	Arg	1943	only	-	Oct	15	0:00	1:00	S
+Rule	Arg	1943	only	-	Oct	15	0:00	1:00	-
 Rule	Arg	1946	only	-	Mar	 1	0:00	0	-
-Rule	Arg	1946	only	-	Oct	 1	0:00	1:00	S
+Rule	Arg	1946	only	-	Oct	 1	0:00	1:00	-
 Rule	Arg	1963	only	-	Oct	 1	0:00	0	-
-Rule	Arg	1963	only	-	Dec	15	0:00	1:00	S
+Rule	Arg	1963	only	-	Dec	15	0:00	1:00	-
 Rule	Arg	1964	1966	-	Mar	 1	0:00	0	-
-Rule	Arg	1964	1966	-	Oct	15	0:00	1:00	S
+Rule	Arg	1964	1966	-	Oct	15	0:00	1:00	-
 Rule	Arg	1967	only	-	Apr	 2	0:00	0	-
-Rule	Arg	1967	1968	-	Oct	Sun>=1	0:00	1:00	S
+Rule	Arg	1967	1968	-	Oct	Sun>=1	0:00	1:00	-
 Rule	Arg	1968	1969	-	Apr	Sun>=1	0:00	0	-
-Rule	Arg	1974	only	-	Jan	23	0:00	1:00	S
+Rule	Arg	1974	only	-	Jan	23	0:00	1:00	-
 Rule	Arg	1974	only	-	May	 1	0:00	0	-
-Rule	Arg	1988	only	-	Dec	 1	0:00	1:00	S
+Rule	Arg	1988	only	-	Dec	 1	0:00	1:00	-
 #
 # From Hernan G. Otero (1995-06-26):
 # These corrections were contributed by InterSoft Argentina S.A.,
@@ -99,7 +99,7 @@
 # Talleres de Hidrografía Naval Argentina
 # (Argentine Naval Hydrography Institute)
 Rule	Arg	1989	1993	-	Mar	Sun>=1	0:00	0	-
-Rule	Arg	1989	1992	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Arg	1989	1992	-	Oct	Sun>=15	0:00	1:00	-
 #
 # From Hernan G. Otero (1995-06-26):
 # From this moment on, the law that mandated the daylight saving
@@ -110,7 +110,7 @@
 # On October 3, 1999, 0:00 local, Argentina implemented daylight savings time,
 # which did not result in the switch of a time zone, as they stayed 9 hours
 # from the International Date Line.
-Rule	Arg	1999	only	-	Oct	Sun>=1	0:00	1:00	S
+Rule	Arg	1999	only	-	Oct	Sun>=1	0:00	1:00	-
 # From Paul Eggert (2007-12-28):
 # DST was set to expire on March 5, not March 3, but since it was converted
 # to standard time on March 3 it's more convenient for us to pretend that
@@ -213,9 +213,9 @@
 # la modificación del huso horario, ya que 2009 nos encuentra con
 # crecimiento en la producción y distribución energética."
 
-Rule	Arg	2007	only	-	Dec	30	0:00	1:00	S
+Rule	Arg	2007	only	-	Dec	30	0:00	1:00	-
 Rule	Arg	2008	2009	-	Mar	Sun>=15	0:00	0	-
-Rule	Arg	2008	only	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Arg	2008	only	-	Oct	Sun>=15	0:00	1:00	-
 
 # From Mariano Absatz (2004-05-21):
 # Today it was officially published that the Province of Mendoza is changing
@@ -225,12 +225,14 @@
 # It's Law No. 7,210.  This change is due to a public power emergency, so for
 # now we'll assume it's for this year only.
 #
-# From Paul Eggert (2014-08-09):
+# From Paul Eggert (2018-01-31):
 # Hora de verano para la República Argentina
 # http://buenasiembra.com.ar/esoterismo/astrologia/hora-de-verano-de-la-republica-argentina-27.html
 # says that standard time in Argentina from 1894-10-31
 # to 1920-05-01 was -4:16:48.25.  Go with this more-precise value
-# over Shanks & Pottenger.
+# over Shanks & Pottenger.  It is upward compatible with Milne, who
+# says Córdoba time was -4:16:48.2.
+
 #
 # From Mariano Absatz (2004-06-05):
 # These media articles from a major newspaper mostly cover the current state:
@@ -404,9 +406,9 @@
 # rules...San Luis is still using "Western ARgentina Time" and it got
 # stuck on Summer daylight savings time even though the summer is over.
 
-# From Paul Eggert (2013-09-05):
+# From Paul Eggert (2018-01-23):
 # Perhaps San Luis operates on the legal fiction that it is at -04
-# with perpetual summer time, but ordinary usage typically seems to
+# with perpetual daylight saving time, but ordinary usage typically seems to
 # just say it's at -03; see, for example,
 # https://es.wikipedia.org/wiki/Hora_oficial_argentina
 # We've documented similar situations as being plain changes to
@@ -415,9 +417,6 @@
 # plus is that this silences a zic complaint that there's no POSIX TZ
 # setting for time stamps past 2038.
 
-# From Paul Eggert (2013-02-21):
-# Milne says Córdoba time was -4:16:48.2.  Round to the nearest second.
-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 #
 # Buenos Aires (BA), Capital Federal (CF),
@@ -552,7 +551,7 @@
 # San Luis (SL)
 
 Rule	SanLuis	2008	2009	-	Mar	Sun>=8	0:00	0	-
-Rule	SanLuis	2007	2008	-	Oct	Sun>=8	0:00	1:00	S
+Rule	SanLuis	2007	2008	-	Oct	Sun>=8	0:00	1:00	-
 
 Zone America/Argentina/San_Luis -4:25:24 - LMT	1894 Oct 31
 			-4:16:48 -	CMT	1920 May
@@ -794,14 +793,14 @@
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 # Decree 20,466 <http://pcdsh01.on.br/HV20466.htm> (1931-10-01)
 # Decree 21,896 <http://pcdsh01.on.br/HV21896.htm> (1932-01-10)
-Rule	Brazil	1931	only	-	Oct	 3	11:00	1:00	S
+Rule	Brazil	1931	only	-	Oct	 3	11:00	1:00	-
 Rule	Brazil	1932	1933	-	Apr	 1	 0:00	0	-
-Rule	Brazil	1932	only	-	Oct	 3	 0:00	1:00	S
+Rule	Brazil	1932	only	-	Oct	 3	 0:00	1:00	-
 # Decree 23,195 <http://pcdsh01.on.br/HV23195.htm> (1933-10-10)
 # revoked DST.
 # Decree 27,496 <http://pcdsh01.on.br/HV27496.htm> (1949-11-24)
 # Decree 27,998 <http://pcdsh01.on.br/HV27998.htm> (1950-04-13)
-Rule	Brazil	1949	1952	-	Dec	 1	 0:00	1:00	S
+Rule	Brazil	1949	1952	-	Dec	 1	 0:00	1:00	-
 Rule	Brazil	1950	only	-	Apr	16	 1:00	0	-
 Rule	Brazil	1951	1952	-	Apr	 1	 0:00	0	-
 # Decree 32,308 <http://pcdsh01.on.br/HV32308.htm> (1953-02-24)
@@ -813,51 +812,51 @@
 # in SP, RJ, GB, MG, ES, due to the prolongation of the drought.
 # Decree 53,071 <http://pcdsh01.on.br/HV53071.htm> (1963-12-03)
 # extended the above decree to all of the national territory on 12-09.
-Rule	Brazil	1963	only	-	Dec	 9	 0:00	1:00	S
+Rule	Brazil	1963	only	-	Dec	 9	 0:00	1:00	-
 # Decree 53,604 <http://pcdsh01.on.br/HV53604.htm> (1964-02-25)
 # extended summer time by one day to 1964-03-01 00:00 (start of school).
 Rule	Brazil	1964	only	-	Mar	 1	 0:00	0	-
 # Decree 55,639 <http://pcdsh01.on.br/HV55639.htm> (1965-01-27)
-Rule	Brazil	1965	only	-	Jan	31	 0:00	1:00	S
+Rule	Brazil	1965	only	-	Jan	31	 0:00	1:00	-
 Rule	Brazil	1965	only	-	Mar	31	 0:00	0	-
 # Decree 57,303 <http://pcdsh01.on.br/HV57303.htm> (1965-11-22)
-Rule	Brazil	1965	only	-	Dec	 1	 0:00	1:00	S
+Rule	Brazil	1965	only	-	Dec	 1	 0:00	1:00	-
 # Decree 57,843 <http://pcdsh01.on.br/HV57843.htm> (1966-02-18)
 Rule	Brazil	1966	1968	-	Mar	 1	 0:00	0	-
-Rule	Brazil	1966	1967	-	Nov	 1	 0:00	1:00	S
+Rule	Brazil	1966	1967	-	Nov	 1	 0:00	1:00	-
 # Decree 63,429 <http://pcdsh01.on.br/HV63429.htm> (1968-10-15)
 # revoked DST.
 # Decree 91,698 <http://pcdsh01.on.br/HV91698.htm> (1985-09-27)
-Rule	Brazil	1985	only	-	Nov	 2	 0:00	1:00	S
+Rule	Brazil	1985	only	-	Nov	 2	 0:00	1:00	-
 # Decree 92,310 (1986-01-21)
 # Decree 92,463 (1986-03-13)
 Rule	Brazil	1986	only	-	Mar	15	 0:00	0	-
 # Decree 93,316 (1986-10-01)
-Rule	Brazil	1986	only	-	Oct	25	 0:00	1:00	S
+Rule	Brazil	1986	only	-	Oct	25	 0:00	1:00	-
 Rule	Brazil	1987	only	-	Feb	14	 0:00	0	-
 # Decree 94,922 <http://pcdsh01.on.br/HV94922.htm> (1987-09-22)
-Rule	Brazil	1987	only	-	Oct	25	 0:00	1:00	S
+Rule	Brazil	1987	only	-	Oct	25	 0:00	1:00	-
 Rule	Brazil	1988	only	-	Feb	 7	 0:00	0	-
 # Decree 96,676 <http://pcdsh01.on.br/HV96676.htm> (1988-09-12)
 # except for the states of AC, AM, PA, RR, RO, and AP (then a territory)
-Rule	Brazil	1988	only	-	Oct	16	 0:00	1:00	S
+Rule	Brazil	1988	only	-	Oct	16	 0:00	1:00	-
 Rule	Brazil	1989	only	-	Jan	29	 0:00	0	-
 # Decree 98,077 <http://pcdsh01.on.br/HV98077.htm> (1989-08-21)
 # with the same exceptions
-Rule	Brazil	1989	only	-	Oct	15	 0:00	1:00	S
+Rule	Brazil	1989	only	-	Oct	15	 0:00	1:00	-
 Rule	Brazil	1990	only	-	Feb	11	 0:00	0	-
 # Decree 99,530 <http://pcdsh01.on.br/HV99530.htm> (1990-09-17)
 # adopted by RS, SC, PR, SP, RJ, ES, MG, GO, MS, DF.
 # Decree 99,629 (1990-10-19) adds BA, MT.
-Rule	Brazil	1990	only	-	Oct	21	 0:00	1:00	S
+Rule	Brazil	1990	only	-	Oct	21	 0:00	1:00	-
 Rule	Brazil	1991	only	-	Feb	17	 0:00	0	-
 # Unnumbered decree <http://pcdsh01.on.br/HV1991.htm> (1991-09-25)
 # adopted by RS, SC, PR, SP, RJ, ES, MG, BA, GO, MT, MS, DF.
-Rule	Brazil	1991	only	-	Oct	20	 0:00	1:00	S
+Rule	Brazil	1991	only	-	Oct	20	 0:00	1:00	-
 Rule	Brazil	1992	only	-	Feb	 9	 0:00	0	-
 # Unnumbered decree <http://pcdsh01.on.br/HV1992.htm> (1992-10-16)
 # adopted by same states.
-Rule	Brazil	1992	only	-	Oct	25	 0:00	1:00	S
+Rule	Brazil	1992	only	-	Oct	25	 0:00	1:00	-
 Rule	Brazil	1993	only	-	Jan	31	 0:00	0	-
 # Decree 942 <http://pcdsh01.on.br/HV942.htm> (1993-09-28)
 # adopted by same states, plus AM.
@@ -867,12 +866,12 @@
 # adopted by same states, plus MT and TO.
 # Decree 1,674 <http://pcdsh01.on.br/HV1674.htm> (1995-10-13)
 # adds AL, SE.
-Rule	Brazil	1993	1995	-	Oct	Sun>=11	 0:00	1:00	S
+Rule	Brazil	1993	1995	-	Oct	Sun>=11	 0:00	1:00	-
 Rule	Brazil	1994	1995	-	Feb	Sun>=15	 0:00	0	-
 Rule	Brazil	1996	only	-	Feb	11	 0:00	0	-
 # Decree 2,000 <http://pcdsh01.on.br/HV2000.htm> (1996-09-04)
 # adopted by same states, minus AL, SE.
-Rule	Brazil	1996	only	-	Oct	 6	 0:00	1:00	S
+Rule	Brazil	1996	only	-	Oct	 6	 0:00	1:00	-
 Rule	Brazil	1997	only	-	Feb	16	 0:00	0	-
 # From Daniel C. Sobral (1998-02-12):
 # In 1997, the DS began on October 6. The stated reason was that
@@ -882,19 +881,19 @@
 # to help dealing with the shortages of electric power.
 #
 # Decree 2,317 (1997-09-04), adopted by same states.
-Rule	Brazil	1997	only	-	Oct	 6	 0:00	1:00	S
+Rule	Brazil	1997	only	-	Oct	 6	 0:00	1:00	-
 # Decree 2,495 <http://pcdsh01.on.br/figuras/HV2495.JPG>
 # (1998-02-10)
 Rule	Brazil	1998	only	-	Mar	 1	 0:00	0	-
 # Decree 2,780 <http://pcdsh01.on.br/figuras/Hv98.jpg> (1998-09-11)
 # adopted by the same states as before.
-Rule	Brazil	1998	only	-	Oct	11	 0:00	1:00	S
+Rule	Brazil	1998	only	-	Oct	11	 0:00	1:00	-
 Rule	Brazil	1999	only	-	Feb	21	 0:00	0	-
 # Decree 3,150 <http://pcdsh01.on.br/figuras/HV3150.gif>
 # (1999-08-23) adopted by same states.
 # Decree 3,188 <http://pcdsh01.on.br/DecHV99.gif> (1999-09-30)
 # adds SE, AL, PB, PE, RN, CE, PI, MA and RR.
-Rule	Brazil	1999	only	-	Oct	 3	 0:00	1:00	S
+Rule	Brazil	1999	only	-	Oct	 3	 0:00	1:00	-
 Rule	Brazil	2000	only	-	Feb	27	 0:00	0	-
 # Decree 3,592 <http://pcdsh01.on.br/DEC3592.htm> (2000-09-06)
 # adopted by the same states as before.
@@ -904,34 +903,34 @@
 # repeals DST in SE, AL, PB, RN, CE, PI and MA, effective 2000-10-22 00:00.
 # Decree 3,916 <http://pcdsh01.on.br/figuras/HV3916.gif>
 # (2001-09-13) reestablishes DST in AL, CE, MA, PB, PE, PI, RN, SE.
-Rule	Brazil	2000	2001	-	Oct	Sun>=8	 0:00	1:00	S
+Rule	Brazil	2000	2001	-	Oct	Sun>=8	 0:00	1:00	-
 Rule	Brazil	2001	2006	-	Feb	Sun>=15	 0:00	0	-
 # Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE.
 # 4,399 <http://www.presidencia.gov.br/CCIVIL/decreto/2002/D4399.htm>
-Rule	Brazil	2002	only	-	Nov	 3	 0:00	1:00	S
+Rule	Brazil	2002	only	-	Nov	 3	 0:00	1:00	-
 # Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
 # 4,844 <http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm>
-Rule	Brazil	2003	only	-	Oct	19	 0:00	1:00	S
+Rule	Brazil	2003	only	-	Oct	19	 0:00	1:00	-
 # Decree 5,223 (2004-10-01) reestablishes DST in MT.
 # 5,223 <http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm>
-Rule	Brazil	2004	only	-	Nov	 2	 0:00	1:00	S
+Rule	Brazil	2004	only	-	Nov	 2	 0:00	1:00	-
 # Decree 5,539 <http://pcdsh01.on.br/DecHV5539.gif> (2005-09-19),
 # adopted by the same states as before.
-Rule	Brazil	2005	only	-	Oct	16	 0:00	1:00	S
+Rule	Brazil	2005	only	-	Oct	16	 0:00	1:00	-
 # Decree 5,920 <http://pcdsh01.on.br/DecHV5920.gif> (2006-10-03),
 # adopted by the same states as before.
-Rule	Brazil	2006	only	-	Nov	 5	 0:00	1:00	S
+Rule	Brazil	2006	only	-	Nov	 5	 0:00	1:00	-
 Rule	Brazil	2007	only	-	Feb	25	 0:00	0	-
 # Decree 6,212 <http://pcdsh01.on.br/DecHV6212.gif> (2007-09-26),
 # adopted by the same states as before.
-Rule	Brazil	2007	only	-	Oct	Sun>=8	 0:00	1:00	S
+Rule	Brazil	2007	only	-	Oct	Sun>=8	 0:00	1:00	-
 # From Frederico A. C. Neves (2008-09-10):
 # According to this decree
 # http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm
 # [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the
 # 3rd Feb Sunday. There is an exception on the return date when this is
 # the Carnival Sunday then the return date will be the next Sunday...
-Rule	Brazil	2008	2017	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Brazil	2008	2017	-	Oct	Sun>=15	0:00	1:00	-
 Rule	Brazil	2008	2011	-	Feb	Sun>=15	0:00	0	-
 # Decree 7,584 <http://pcdsh01.on.br/HVdecreto7584_20111013.jpg> (2011-10-13)
 # added Bahia.
@@ -949,7 +948,7 @@
 # ... https://www.timeanddate.com/news/time/brazil-delays-dst-2018.html
 # From Steffen Thorsen (2017-12-20):
 # http://www.planalto.gov.br/ccivil_03/_ato2015-2018/2017/decreto/D9242.htm
-Rule	Brazil	2018	max	-	Nov	Sun>=1	0:00	1:00	S
+Rule	Brazil	2018	max	-	Nov	Sun>=1	0:00	1:00	-
 Rule	Brazil	2023	only	-	Feb	Sun>=22	0:00	0	-
 Rule	Brazil	2024	2025	-	Feb	Sun>=15	0:00	0	-
 Rule	Brazil	2026	only	-	Feb	Sun>=22	0:00	0	-
@@ -1256,28 +1255,28 @@
 # For now, assume that they will not revert.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Chile	1927	1931	-	Sep	 1	0:00	1:00	S
+Rule	Chile	1927	1931	-	Sep	 1	0:00	1:00	-
 Rule	Chile	1928	1932	-	Apr	 1	0:00	0	-
-Rule	Chile	1968	only	-	Nov	 3	4:00u	1:00	S
+Rule	Chile	1968	only	-	Nov	 3	4:00u	1:00	-
 Rule	Chile	1969	only	-	Mar	30	3:00u	0	-
-Rule	Chile	1969	only	-	Nov	23	4:00u	1:00	S
+Rule	Chile	1969	only	-	Nov	23	4:00u	1:00	-
 Rule	Chile	1970	only	-	Mar	29	3:00u	0	-
 Rule	Chile	1971	only	-	Mar	14	3:00u	0	-
-Rule	Chile	1970	1972	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1970	1972	-	Oct	Sun>=9	4:00u	1:00	-
 Rule	Chile	1972	1986	-	Mar	Sun>=9	3:00u	0	-
-Rule	Chile	1973	only	-	Sep	30	4:00u	1:00	S
-Rule	Chile	1974	1987	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1973	only	-	Sep	30	4:00u	1:00	-
+Rule	Chile	1974	1987	-	Oct	Sun>=9	4:00u	1:00	-
 Rule	Chile	1987	only	-	Apr	12	3:00u	0	-
 Rule	Chile	1988	1990	-	Mar	Sun>=9	3:00u	0	-
-Rule	Chile	1988	1989	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	Chile	1990	only	-	Sep	16	4:00u	1:00	S
+Rule	Chile	1988	1989	-	Oct	Sun>=9	4:00u	1:00	-
+Rule	Chile	1990	only	-	Sep	16	4:00u	1:00	-
 Rule	Chile	1991	1996	-	Mar	Sun>=9	3:00u	0	-
-Rule	Chile	1991	1997	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1991	1997	-	Oct	Sun>=9	4:00u	1:00	-
 Rule	Chile	1997	only	-	Mar	30	3:00u	0	-
 Rule	Chile	1998	only	-	Mar	Sun>=9	3:00u	0	-
-Rule	Chile	1998	only	-	Sep	27	4:00u	1:00	S
+Rule	Chile	1998	only	-	Sep	27	4:00u	1:00	-
 Rule	Chile	1999	only	-	Apr	 4	3:00u	0	-
-Rule	Chile	1999	2010	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1999	2010	-	Oct	Sun>=9	4:00u	1:00	-
 Rule	Chile	2000	2007	-	Mar	Sun>=9	3:00u	0	-
 # N.B.: the end of March 29 in Chile is March 30 in Universal time,
 # which is used below in specifying the transition.
@@ -1285,11 +1284,11 @@
 Rule	Chile	2009	only	-	Mar	Sun>=9	3:00u	0	-
 Rule	Chile	2010	only	-	Apr	Sun>=1	3:00u	0	-
 Rule	Chile	2011	only	-	May	Sun>=2	3:00u	0	-
-Rule	Chile	2011	only	-	Aug	Sun>=16	4:00u	1:00	S
+Rule	Chile	2011	only	-	Aug	Sun>=16	4:00u	1:00	-
 Rule	Chile	2012	2014	-	Apr	Sun>=23	3:00u	0	-
-Rule	Chile	2012	2014	-	Sep	Sun>=2	4:00u	1:00	S
+Rule	Chile	2012	2014	-	Sep	Sun>=2	4:00u	1:00	-
 Rule	Chile	2016	max	-	May	Sun>=9	3:00u	0	-
-Rule	Chile	2016	max	-	Aug	Sun>=9	4:00u	1:00	S
+Rule	Chile	2016	max	-	Aug	Sun>=9	4:00u	1:00	-
 # IATA SSIM anomalies: (1992-02) says 1992-03-14;
 # (1996-09) says 1998-03-08.  Ignore these.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1354,7 +1353,7 @@
 # "A variation of fifteen minutes in the public clocks of Bogota is not rare."
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	CO	1992	only	-	May	 3	0:00	1:00	S
+Rule	CO	1992	only	-	May	 3	0:00	1:00	-
 Rule	CO	1993	only	-	Apr	 4	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Bogota	-4:56:16 -	LMT	1884 Mar 13
@@ -1414,7 +1413,7 @@
 # repeated.  For now, assume transitions were at 00:00 local time country-wide.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Ecuador	1992	only	-	Nov	28	0:00	1:00	S
+Rule	Ecuador	1992	only	-	Nov	28	0:00	1:00	-
 Rule	Ecuador	1993	only	-	Feb	 5	0:00	0	-
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1504,22 +1503,22 @@
 #   the maintainers of the database to inform them we're adopting
 #   the same policy this year and suggest recommendations for future years.
 #
-# For now we will assume permanent summer time for the Falklands
+# For now we will assume permanent -03 for the Falklands
 # until advised differently (to apply for 2012 and beyond, after the 2011
 # experiment was apparently successful.)
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Falk	1937	1938	-	Sep	lastSun	0:00	1:00	S
+Rule	Falk	1937	1938	-	Sep	lastSun	0:00	1:00	-
 Rule	Falk	1938	1942	-	Mar	Sun>=19	0:00	0	-
-Rule	Falk	1939	only	-	Oct	1	0:00	1:00	S
-Rule	Falk	1940	1942	-	Sep	lastSun	0:00	1:00	S
+Rule	Falk	1939	only	-	Oct	1	0:00	1:00	-
+Rule	Falk	1940	1942	-	Sep	lastSun	0:00	1:00	-
 Rule	Falk	1943	only	-	Jan	1	0:00	0	-
-Rule	Falk	1983	only	-	Sep	lastSun	0:00	1:00	S
+Rule	Falk	1983	only	-	Sep	lastSun	0:00	1:00	-
 Rule	Falk	1984	1985	-	Apr	lastSun	0:00	0	-
-Rule	Falk	1984	only	-	Sep	16	0:00	1:00	S
-Rule	Falk	1985	2000	-	Sep	Sun>=9	0:00	1:00	S
+Rule	Falk	1984	only	-	Sep	16	0:00	1:00	-
+Rule	Falk	1985	2000	-	Sep	Sun>=9	0:00	1:00	-
 Rule	Falk	1986	2000	-	Apr	Sun>=16	0:00	0	-
 Rule	Falk	2001	2010	-	Apr	Sun>=15	2:00	0	-
-Rule	Falk	2001	2010	-	Sep	Sun>=1	2:00	1:00	S
+Rule	Falk	2001	2010	-	Sep	Sun>=1	2:00	1:00	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Atlantic/Stanley	-3:51:24 -	LMT	1890
 			-3:51:24 -	SMT	1912 Mar 12 # Stanley Mean Time
@@ -1554,16 +1553,16 @@
 # adjust their clocks at 0 hour of the given dates.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Para	1975	1988	-	Oct	 1	0:00	1:00	S
+Rule	Para	1975	1988	-	Oct	 1	0:00	1:00	-
 Rule	Para	1975	1978	-	Mar	 1	0:00	0	-
 Rule	Para	1979	1991	-	Apr	 1	0:00	0	-
-Rule	Para	1989	only	-	Oct	22	0:00	1:00	S
-Rule	Para	1990	only	-	Oct	 1	0:00	1:00	S
-Rule	Para	1991	only	-	Oct	 6	0:00	1:00	S
+Rule	Para	1989	only	-	Oct	22	0:00	1:00	-
+Rule	Para	1990	only	-	Oct	 1	0:00	1:00	-
+Rule	Para	1991	only	-	Oct	 6	0:00	1:00	-
 Rule	Para	1992	only	-	Mar	 1	0:00	0	-
-Rule	Para	1992	only	-	Oct	 5	0:00	1:00	S
+Rule	Para	1992	only	-	Oct	 5	0:00	1:00	-
 Rule	Para	1993	only	-	Mar	31	0:00	0	-
-Rule	Para	1993	1995	-	Oct	 1	0:00	1:00	S
+Rule	Para	1993	1995	-	Oct	 1	0:00	1:00	-
 Rule	Para	1994	1995	-	Feb	lastSun	0:00	0	-
 Rule	Para	1996	only	-	Mar	 1	0:00	0	-
 # IATA SSIM (2000-02) says 1999-10-10; ignore this for now.
@@ -1581,7 +1580,7 @@
 # year, the time will change on the first Sunday of October; likewise, the
 # clock will be set back on the first Sunday of March.
 #
-Rule	Para	1996	2001	-	Oct	Sun>=1	0:00	1:00	S
+Rule	Para	1996	2001	-	Oct	Sun>=1	0:00	1:00	-
 # IATA SSIM (1997-09) says Mar 1; go with Shanks & Pottenger.
 Rule	Para	1997	only	-	Feb	lastSun	0:00	0	-
 # Shanks & Pottenger say 1999-02-28; IATA SSIM (1999-02) says 1999-02-27, but
@@ -1592,7 +1591,7 @@
 # dst method to be from the first Sunday in September to the first Sunday in
 # April.
 Rule	Para	2002	2004	-	Apr	Sun>=1	0:00	0	-
-Rule	Para	2002	2003	-	Sep	Sun>=1	0:00	1:00	S
+Rule	Para	2002	2003	-	Sep	Sun>=1	0:00	1:00	-
 #
 # From Jesper Nørgaard Welen (2005-01-02):
 # There are several sources that claim that Paraguay made
@@ -1601,7 +1600,7 @@
 # Decree 1,867 (2004-03-05)
 # From Carlos Raúl Perasso via Jesper Nørgaard Welen (2006-10-13)
 # http://www.presidencia.gov.py/decretos/D1867.pdf
-Rule	Para	2004	2009	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Para	2004	2009	-	Oct	Sun>=15	0:00	1:00	-
 Rule	Para	2005	2009	-	Mar	Sun>=8	0:00	0	-
 # From Carlos Raúl Perasso (2010-02-18):
 # By decree number 3958 issued yesterday
@@ -1614,7 +1613,7 @@
 # and that on the first Sunday of the month of October, it is to be set
 # forward 60 minutes, in all the territory of the Paraguayan Republic.
 # ...
-Rule	Para	2010	max	-	Oct	Sun>=1	0:00	1:00	S
+Rule	Para	2010	max	-	Oct	Sun>=1	0:00	1:00	-
 Rule	Para	2010	2012	-	Apr	Sun>=8	0:00	0	-
 #
 # From Steffen Thorsen (2013-03-07):
@@ -1647,16 +1646,16 @@
 # Shanks & Pottenger don't have this transition.  Assume 1986 was like 1987.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Peru	1938	only	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1938	only	-	Jan	 1	0:00	1:00	-
 Rule	Peru	1938	only	-	Apr	 1	0:00	0	-
-Rule	Peru	1938	1939	-	Sep	lastSun	0:00	1:00	S
+Rule	Peru	1938	1939	-	Sep	lastSun	0:00	1:00	-
 Rule	Peru	1939	1940	-	Mar	Sun>=24	0:00	0	-
-Rule	Peru	1986	1987	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1986	1987	-	Jan	 1	0:00	1:00	-
 Rule	Peru	1986	1987	-	Apr	 1	0:00	0	-
-Rule	Peru	1990	only	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1990	only	-	Jan	 1	0:00	1:00	-
 Rule	Peru	1990	only	-	Apr	 1	0:00	0	-
 # IATA is ambiguous for 1993/1995; go with Shanks & Pottenger.
-Rule	Peru	1994	only	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1994	only	-	Jan	 1	0:00	1:00	-
 Rule	Peru	1994	only	-	Apr	 1	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Lima	-5:08:12 -	LMT	1890
@@ -1702,72 +1701,201 @@
 # Uruguay
 # From Paul Eggert (1993-11-18):
 # Uruguay wins the prize for the strangest peacetime manipulation of the rules.
-# From Shanks & Pottenger:
+#
+# From Tim Parenti (2018-02-20), per Jeremie Bonjour (2018-01-31) and Michael
+# Deckers (2018-02-20):
+# ... At least they kept good records...
+#
+# http://www.armada.mil.uy/ContenidosPDFs/sohma/web/almanaque/almanaque_2018.pdf#page=36
+# Page 36 of Almanaque 2018, published by the Oceanography, Hydrography, and
+# Meteorology Service of the Uruguayan Navy, seems to give many transitions
+# with greater clarity than we've had before.  It directly references many laws
+# and decrees which are, in turn, referenced below.  They can be viewed in the
+# public archives of the Diario Oficial (in Spanish) at
+# http://www.impo.com.uy/diariooficial/
+#
+# Ley No. 3920 of 1908-06-10 placed the determination of legal time under the
+# auspices of the National Institute for the Prediction of Time.  It is unclear
+# exactly what offset was used during this period, though Ley No. 7200 of
+# 1920-04-23 used the Observatory of the National Meteorological Institute in
+# Montevideo (34° 54' 33" S, 56° 12' 45" W) as its reference meridian,
+# retarding legal time by 15 minutes 9 seconds from 1920-04-30 24:00,
+# resulting in UT-04.  Assume the corresponding LMT of UT-03:44:51 (given on
+# page 725 of the Proceedings of the Second Pan-American Scientific Congress,
+# 1915-1916) was in use, and merely became official from 1908-06-10.
+# https://www.impo.com.uy/diariooficial/1908/06/18/12
+# https://www.impo.com.uy/diariooficial/1920/04/27/9
+#
+# Ley No. 7594 of 1923-06-28 specified legal time as Observatory time advanced
+# by 44 minutes 51 seconds (UT-03) "from 30 September to 31 March", and by 14
+# minutes 51 seconds (UT-03:30) "the rest of the year"; a message from the
+# National Council of Administration the same day, published directly below the
+# law in the Diario Oficial, specified the first transition to be 1923-09-30
+# 24:00.  This effectively established standard time at UT-03:30 with 30
+# minutes DST.  Assume transitions at 24:00 on the specified days until Ley No.
+# 7919 of 1926-03-05 ended this arrangement, repealing all "laws and other
+# provisions which oppose" it, resulting in year-round UT-03:30; a Resolución
+# of 1926-03-11 puts the final transition at 1926-03-31 24:00, the same as it
+# would have been under the previous law.
+# https://www.impo.com.uy/diariooficial/1923/07/02/2
+# https://www.impo.com.uy/diariooficial/1926/03/10/2
+# https://www.impo.com.uy/diariooficial/1926/03/18/2
+#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# Whitman gives 1923 Oct 1; go with Shanks & Pottenger.
-Rule	Uruguay	1923	only	-	Oct	 2	 0:00	0:30	HS
+Rule	Uruguay	1923	1925	-	Oct	 1	 0:00	0:30	-
 Rule	Uruguay	1924	1926	-	Apr	 1	 0:00	0	-
-Rule	Uruguay	1924	1925	-	Oct	 1	 0:00	0:30	HS
-Rule	Uruguay	1933	1935	-	Oct	lastSun	 0:00	0:30	HS
-# Shanks & Pottenger give 1935 Apr 1 0:00 & 1936 Mar 30 0:00; go with Whitman.
-Rule	Uruguay	1934	1936	-	Mar	Sat>=25	23:30s	0	-
-Rule	Uruguay	1936	only	-	Nov	 1	 0:00	0:30	HS
-Rule	Uruguay	1937	1941	-	Mar	lastSun	 0:00	0	-
-# Whitman gives 1937 Oct 3; go with Shanks & Pottenger.
-Rule	Uruguay	1937	1940	-	Oct	lastSun	 0:00	0:30	HS
-# Whitman gives 1941 Oct 24 - 1942 Mar 27, 1942 Dec 14 - 1943 Apr 13,
-# and 1943 Apr 13 "to present time"; go with Shanks & Pottenger.
-Rule	Uruguay	1941	only	-	Aug	 1	 0:00	0:30	HS
-Rule	Uruguay	1942	only	-	Jan	 1	 0:00	0	-
-Rule	Uruguay	1942	only	-	Dec	14	 0:00	1:00	S
+# From Tim Parenti (2018-02-15):
+# http://www.impo.com.uy/diariooficial/1933/10/27/6
+#
+# It appears Ley No. 9122 of 1933 was never published as such in the Diario
+# Oficial, but instead appeared as Document 26 in the Diario on Friday
+# 1933-10-27 as a decree made Monday 1933-10-23 and filed under the Ministry of
+# National Defense.  It reinstituted a DST of 30 minutes (to UT-03) "from the
+# last Sunday of October...until the last Saturday of March."  In accordance
+# with this provision, the first transition was explicitly specified in Article
+# 2 of the decree as Saturday 1933-10-28 at 24:00; that is, Sunday 1933-10-29
+# at 00:00.  Assume transitions at 00:00 Sunday throughout.
+#
+# Departing from the matter-of-fact nature of previous timekeeping laws, the
+# 1933 decree "consider[s] the advantages of...the advance of legal time":
+#
+#   "Whereas: The measure adopted by almost all nations at the time of the last
+#    World War still persists in North America and Europe, precisely because of
+#    the economic, hygienic, and social advantages derived from such an
+#    emergency measure...
+#
+#    Whereas: The advance of the legal time during the summer seasons, by
+#    displacing social activity near sunrise, favors the citizen populations
+#    and especially the society that creates and works..."
+#
+# It further specified that "necessary measures" be taken to ensure that
+# "public spectacles finish, in general, before [01:00]."
+Rule	Uruguay	1933	1938	-	Oct	lastSun	 0:00	0:30	-
+Rule	Uruguay	1934	1941	-	Mar	lastSat	24:00	0	-
+# From Tim Parenti (2018-02-15):
+# Most of the Rules below, and their contemporaneous Zone lines, have been
+# updated simply to match the Almanaque 2018.  Although the document does not
+# list exact transition times, midnight transitions were already present in our
+# data here for all transitions through 2004-09, and this is both consistent
+# with prior transitions and verified in several decrees marked below between
+# 1939-09 and 2004-09, wherein the relevant text was typically of the form:
+#
+#   "From 0 hours on [date], the legal time of the entire Republic will be...
+#
+#    In accordance with [the preceding], on [previous date] at 24 hours, all
+#    clocks throughout the Republic will be [advanced/retarded] by..."
+#
+# It is possible that there is greater specificity to be found for the Rules
+# below, but it is buried in no fewer than 40 different decrees individually
+# referenced by the Almanaque for the period from 1939-09 to 2014-09.
+# Four-fifths of these were promulgated less than two weeks before taking
+# effect; more than half within a week and none more than 5 weeks.  Only the
+# handful with comments below have been checked with any thoroughness.
+Rule	Uruguay	1939	only	-	Oct	 1	 0:00	0:30	-
+Rule	Uruguay	1940	only	-	Oct	27	 0:00	0:30	-
+# From Tim Parenti (2018-02-15):
+# Decreto 1145 of the Ministry of National Defense, dated 1941-07-26, specified
+# UT-03 from Friday 1941-08-01 00:00, citing an "urgent...need to save fuel".
+# http://www.impo.com.uy/diariooficial/1941/08/04/1
+Rule	Uruguay	1941	only	-	Aug	 1	 0:00	0:30	-
+# From Tim Parenti (2018-02-15):
+# Decreto 1866 of the Ministry of National Defense, dated 1942-12-09, specified
+# further advancement (to UT-02:30) from Sunday 1942-12-13 24:00.  Since clocks
+# never went back to UT-03:30 thereafter, this is modeled as advancing standard
+# time by 30 minutes to UT-03, while retaining 30 minutes of DST.
+# http://www.impo.com.uy/diariooficial/1942/12/16/3
+Rule	Uruguay	1942	only	-	Dec	14	 0:00	0:30	-
 Rule	Uruguay	1943	only	-	Mar	14	 0:00	0	-
-Rule	Uruguay	1959	only	-	May	24	 0:00	1:00	S
+Rule	Uruguay	1959	only	-	May	24	 0:00	0:30	-
 Rule	Uruguay	1959	only	-	Nov	15	 0:00	0	-
-Rule	Uruguay	1960	only	-	Jan	17	 0:00	1:00	S
+Rule	Uruguay	1960	only	-	Jan	17	 0:00	1:00	-
 Rule	Uruguay	1960	only	-	Mar	 6	 0:00	0	-
-Rule	Uruguay	1965	1967	-	Apr	Sun>=1	 0:00	1:00	S
+Rule	Uruguay	1965	only	-	Apr	 4	 0:00	1:00	-
 Rule	Uruguay	1965	only	-	Sep	26	 0:00	0	-
-Rule	Uruguay	1966	1967	-	Oct	31	 0:00	0	-
-Rule	Uruguay	1968	1970	-	May	27	 0:00	0:30	HS
-Rule	Uruguay	1968	1970	-	Dec	 2	 0:00	0	-
-Rule	Uruguay	1972	only	-	Apr	24	 0:00	1:00	S
-Rule	Uruguay	1972	only	-	Aug	15	 0:00	0	-
-Rule	Uruguay	1974	only	-	Mar	10	 0:00	0:30	HS
-Rule	Uruguay	1974	only	-	Dec	22	 0:00	1:00	S
-Rule	Uruguay	1976	only	-	Oct	 1	 0:00	0	-
-Rule	Uruguay	1977	only	-	Dec	 4	 0:00	1:00	S
-Rule	Uruguay	1978	only	-	Apr	 1	 0:00	0	-
-Rule	Uruguay	1979	only	-	Oct	 1	 0:00	1:00	S
-Rule	Uruguay	1980	only	-	May	 1	 0:00	0	-
-Rule	Uruguay	1987	only	-	Dec	14	 0:00	1:00	S
-Rule	Uruguay	1988	only	-	Mar	14	 0:00	0	-
-Rule	Uruguay	1988	only	-	Dec	11	 0:00	1:00	S
-Rule	Uruguay	1989	only	-	Mar	12	 0:00	0	-
-Rule	Uruguay	1989	only	-	Oct	29	 0:00	1:00	S
-# Shanks & Pottenger say no DST was observed in 1990/1 and 1991/2,
-# and that 1992/3's DST was from 10-25 to 03-01.  Go with IATA.
-Rule	Uruguay	1990	1992	-	Mar	Sun>=1	 0:00	0	-
-Rule	Uruguay	1990	1991	-	Oct	Sun>=21	 0:00	1:00	S
-Rule	Uruguay	1992	only	-	Oct	18	 0:00	1:00	S
+# From Tim Parenti (2018-02-15):
+# Decreto 321/968 of 1968-05-25, citing emergency drought measures decreed the
+# day before, brought clocks forward 30 minutes from Monday 1968-05-27 00:00.
+# http://www.impo.com.uy/diariooficial/1968/05/30/5
+Rule	Uruguay	1968	only	-	May	27	 0:00	0:30	-
+Rule	Uruguay	1968	only	-	Dec	 1	 0:00	0	-
+# From Tim Parenti (2018-02-15):
+# Decreto 188/970 of 1970-04-23 instituted restrictions on electricity
+# consumption "as a consequence of the current rainfall regime in the country".
+# Articles 13 and 14 advanced clocks by an hour from Saturday 1970-04-25 00:00.
+# http://www.impo.com.uy/diariooficial/1970/04/29/4
+Rule	Uruguay	1970	only	-	Apr	25	 0:00	1:00	-
+Rule	Uruguay	1970	only	-	Jun	14	 0:00	0	-
+Rule	Uruguay	1972	only	-	Apr	23	 0:00	1:00	-
+Rule	Uruguay	1972	only	-	Jul	16	 0:00	0	-
+# From Tim Parenti (2018-02-15):
+# Decreto 29/974 of 1974-01-11, citing "the international rise in the price of
+# oil", advanced clocks by 90 minutes (to UT-01:30).  Decreto 163/974 of
+# 1974-03-04 returned 60 of those minutes (to UT-02:30), and the remaining 30
+# minutes followed in Decreto 679/974 of 1974-08-29.
+# http://www.impo.com.uy/diariooficial/1974/01/22/11
+# http://www.impo.com.uy/diariooficial/1974/03/14/3
+# http://www.impo.com.uy/diariooficial/1974/09/04/6
+Rule	Uruguay	1974	only	-	Jan	13	 0:00	1:30	-
+Rule	Uruguay	1974	only	-	Mar	10	 0:00	0:30	-
+Rule	Uruguay	1974	only	-	Sep	 1	 0:00	0	-
+Rule	Uruguay	1974	only	-	Dec	22	 0:00	1:00	-
+Rule	Uruguay	1975	only	-	Mar	30	 0:00	0	-
+Rule	Uruguay	1976	only	-	Dec	19	 0:00	1:00	-
+Rule	Uruguay	1977	only	-	Mar	 6	 0:00	0	-
+Rule	Uruguay	1977	only	-	Dec	 4	 0:00	1:00	-
+Rule	Uruguay	1978	1979	-	Mar	Sun>=1	 0:00	0	-
+Rule	Uruguay	1978	only	-	Dec	17	 0:00	1:00	-
+Rule	Uruguay	1979	only	-	Apr	29	 0:00	1:00	-
+Rule	Uruguay	1980	only	-	Mar	16	 0:00	0	-
+# From Tim Parenti (2018-02-15):
+# Decreto 725/987 of 1987-12-04 cited "better use of national tourist
+# attractions" to advance clocks one hour from Monday 1987-12-14 00:00.
+# http://www.impo.com.uy/diariooficial/1988/01/25/1
+Rule	Uruguay	1987	only	-	Dec	14	 0:00	1:00	-
+Rule	Uruguay	1988	only	-	Feb	28	 0:00	0	-
+Rule	Uruguay	1988	only	-	Dec	11	 0:00	1:00	-
+Rule	Uruguay	1989	only	-	Mar	 5	 0:00	0	-
+Rule	Uruguay	1989	only	-	Oct	29	 0:00	1:00	-
+Rule	Uruguay	1990	only	-	Feb	25	 0:00	0	-
+# From Tim Parenti (2018-02-15), per Paul Eggert (1999-11-04):
+# IATA agrees as below for 1990-10 through 1993-02.  Per Almanaque 2018, the
+# 1992/1993 season appears to be the first in over half a century where DST
+# both began and ended pursuant to the same decree.
+Rule	Uruguay	1990	1991	-	Oct	Sun>=21	 0:00	1:00	-
+Rule	Uruguay	1991	1992	-	Mar	Sun>=1	 0:00	0	-
+Rule	Uruguay	1992	only	-	Oct	18	 0:00	1:00	-
 Rule	Uruguay	1993	only	-	Feb	28	 0:00	0	-
 # From Eduardo Cota (2004-09-20):
 # The Uruguayan government has decreed a change in the local time....
-# http://www.presidencia.gub.uy/decretos/2004091502.htm
-Rule	Uruguay	2004	only	-	Sep	19	 0:00	1:00	S
+# From Tim Parenti (2018-02-15):
+# Decreto 328/004 of 2004-09-15.
+# http://www.impo.com.uy/diariooficial/2004/09/23/documentos.pdf#page=1
+Rule	Uruguay	2004	only	-	Sep	19	 0:00	1:00	-
 # From Steffen Thorsen (2005-03-11):
 # Uruguay's DST was scheduled to end on Sunday, 2005-03-13, but in order to
 # save energy ... it was postponed two weeks....
-# http://www.presidencia.gub.uy/_Web/noticias/2005/03/2005031005.htm
+# From Tim Parenti (2018-02-15):
+# This 2005 postponement is not in Almanaque 2018.  Go with the contemporaneous
+# reporting, which is confirmed by Decreto 107/005 of 2005-03-10 amending
+# Decreto 328/004:
+# http://www.impo.com.uy/diariooficial/2005/03/15/documentos.pdf#page=1
+# The original decree specified a transition of 2005-03-12 24:00, but the new
+# one specified 2005-03-27 02:00.
 Rule	Uruguay	2005	only	-	Mar	27	 2:00	0	-
 # From Eduardo Cota (2005-09-27):
-# http://www.presidencia.gub.uy/_Web/decretos/2005/09/CM%20119_09%2009%202005_00001.PDF
-# This means that from 2005-10-09 at 02:00 local time, until 2006-03-12 at
-# 02:00 local time, official time in Uruguay will be at GMT -2.
-Rule	Uruguay	2005	only	-	Oct	 9	 2:00	1:00	S
-Rule	Uruguay	2006	only	-	Mar	12	 2:00	0	-
-# From Jesper Nørgaard Welen (2006-09-06):
-# http://www.presidencia.gub.uy/_web/decretos/2006/09/CM%20210_08%2006%202006_00001.PDF
-#
+# ...from 2005-10-09 at 02:00 local time, until 2006-03-12 at 02:00 local time,
+# official time in Uruguay will be at GMT -2.
+# From Tim Parenti (2018-02-15):
+# Decreto 318/005 of 2005-09-19.
+# http://www.impo.com.uy/diariooficial/2005/09/23/documentos.pdf#page=1
+Rule	Uruguay	2005	only	-	Oct	 9	 2:00	1:00	-
+Rule	Uruguay	2006	2015	-	Mar	Sun>=8	 2:00	0	-
+# From Tim Parenti (2018-02-15), per Jesper Nørgaard Welen (2006-09-06):
+# Decreto 311/006 of 2006-09-04 established regular DST from the first Sunday
+# of October at 02:00 through the second Sunday of March at 02:00.  Almanaque
+# 2018 appears to have a few typoed dates through this period; ignore them.
+# http://www.impo.com.uy/diariooficial/2006/09/08/documentos.pdf#page=1
+Rule	Uruguay	2006	2014	-	Oct	Sun>=1	 2:00	1:00	-
 # From Steffen Thorsen (2015-06-30):
 # ... it looks like they will not be using DST the coming summer:
 # http://www.elobservador.com.uy/gobierno-resolvio-que-no-habra-cambio-horario-verano-n656787
@@ -1777,17 +1905,19 @@
 # instead of out to dinner.
 # From Pablo Camargo (2015-07-13):
 # http://archivo.presidencia.gub.uy/sci/decretos/2015/06/cons_min_201.pdf
-# [dated 2015-06-29; repeals Decree 311/006 dated 2006-09-04]
-Rule	Uruguay	2006	2014	-	Oct	Sun>=1	 2:00	1:00	S
-Rule	Uruguay	2007	2015	-	Mar	Sun>=8	 2:00	0	-
+# From Tim Parenti (2018-02-15):
+# Decreto 178/015 of 2015-06-29; repeals Decreto 311/006.
 
 # This Zone can be simplified once we assume zic %z.
-Zone America/Montevideo	-3:44:44 -	LMT	1898 Jun 28
-			-3:44:44 -	MMT	1920 May  1 # Montevideo MT
+Zone America/Montevideo	-3:44:51 -	LMT	1908 Jun 10
+			-3:44:51 -	MMT	1920 May  1 # Montevideo MT
+			-4:00	-	-04	1923 Oct  1
 			-3:30	Uruguay	-0330/-03 1942 Dec 14
+			-3:00	Uruguay	-03/-0230 1960
 			-3:00	Uruguay	-03/-02	1968
-			-3:00	Uruguay	-03/-0230 1971
+			-3:00	Uruguay	-03/-0230 1970
 			-3:00	Uruguay	-03/-02	1974
+			-3:00	Uruguay	-03/-0130 1974 Mar 10
 			-3:00	Uruguay	-03/-0230 1974 Dec 22
 			-3:00	Uruguay	-03/-02
 
--- a/make/data/tzdata/zone.tab	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/data/tzdata/zone.tab	Thu Apr 12 13:28:52 2018 -0700
@@ -452,7 +452,7 @@
 US	+643004-1652423	America/Nome	Alaska (west)
 US	+515248-1763929	America/Adak	Aleutian Islands
 US	+211825-1575130	Pacific/Honolulu	Hawaii
-UY	-3453-05611	America/Montevideo
+UY	-345433-0561245	America/Montevideo
 UZ	+3940+06648	Asia/Samarkand	Uzbekistan (west)
 UZ	+4120+06918	Asia/Tashkent	Uzbekistan (east)
 VA	+415408+0122711	Europe/Vatican
--- a/make/gensrc/GensrcCLDR.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/gensrc/GensrcCLDR.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2018, 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
@@ -34,19 +34,28 @@
 
 CLDR_BASE_LOCALES := "en-US"
 
+ZONENAME_TEMPLATE := $(TOPDIR)/src/java.base/share/classes/java/time/format/ZoneName.java.template
+
 $(CLDR_BASEMETAINFO_FILE): $(wildcard $(CLDRSRCDIR)/common/dtd/*.dtd) \
     $(wildcard $(CLDRSRCDIR)/common/main/en*.xml) \
     $(wildcard $(CLDRSRCDIR)/common/supplemental/*.xml) \
+    $(ZONENAME_TEMPLATE) \
     $(BUILD_TOOLS_JDK)
 	$(MKDIR) -p $(GENSRC_BASEDIR)
-	$(TOOL_CLDRCONVERTER) -base $(CLDRSRCDIR) -baselocales $(CLDR_BASE_LOCALES) -basemodule -o $(GENSRC_BASEDIR)
+	$(TOOL_CLDRCONVERTER) -base $(CLDRSRCDIR) \
+	    -baselocales $(CLDR_BASE_LOCALES) \
+	    -o $(GENSRC_BASEDIR) \
+	    -basemodule \
+	    -zntempfile $(ZONENAME_TEMPLATE)
 
 $(CLDR_METAINFO_FILE): $(wildcard $(CLDRSRCDIR)/common/dtd/*.dtd) \
     $(wildcard $(CLDRSRCDIR)/common/main/*.xml) \
     $(wildcard $(CLDRSRCDIR)/common/supplemental/*.xml) \
     $(BUILD_TOOLS_JDK)
 	$(MKDIR) -p $(GENSRC_DIR)
-	$(TOOL_CLDRCONVERTER) -base $(CLDRSRCDIR) -baselocales $(CLDR_BASE_LOCALES) -o $(GENSRC_DIR)
+	$(TOOL_CLDRCONVERTER) -base $(CLDRSRCDIR) \
+	    -baselocales $(CLDR_BASE_LOCALES) \
+	    -o $(GENSRC_DIR)
 
 GENSRC_JAVA_BASE += $(CLDR_BASEMETAINFO_FILE)
 GENSRC_JDK_LOCALEDATA += $(CLDR_METAINFO_FILE)
--- a/make/hotspot/gensrc/GensrcDtrace.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/hotspot/gensrc/GensrcDtrace.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -54,4 +54,56 @@
   TARGETS += $(patsubst $(DTRACE_SOURCE_DIR)/%.d, \
       $(DTRACE_GENSRC_DIR)/%.h, $(wildcard $(DTRACE_SOURCE_DIR)/*.d))
 
+  ifeq ($(OPENJDK_TARGET_OS), solaris)
+    ############################################################################
+    # First we need to generate the dtraceGenOffsets tool. When run, this will
+    # produce two header files and a C++ file. Note that generateJvmOffsets.cpp
+    # is using the same JVM_CFLAGS as libjvm.so.
+
+    # Include support files that will setup JVM compiler flags.
+    include lib/JvmFeatures.gmk
+    include lib/JvmFlags.gmk
+
+    # We cannot compile until the JVMTI gensrc has finished
+    JVMTI_H := $(JVM_VARIANT_OUTPUTDIR)/gensrc/jvmtifiles/jvmti.h
+
+    $(eval $(call SetupNativeCompilation, BUILD_DTRACE_GEN_OFFSETS, \
+        NAME := dtraceGenOffsets, \
+        TYPE := EXECUTABLE, \
+        SRC := $(TOPDIR)/make/hotspot/src/native/dtrace, \
+        TOOLCHAIN := $(TOOLCHAIN_BUILD), \
+        LDFLAGS := -m64, \
+        CFLAGS := -m64 $(JVM_CFLAGS), \
+        EXTRA_DEPS := $(JVMTI_H), \
+        OBJECT_DIR := $(JVM_VARIANT_OUTPUTDIR)/tools/dtrace-gen-offsets/objs, \
+        OUTPUT_DIR := $(JVM_VARIANT_OUTPUTDIR)/tools/dtrace-gen-offsets, \
+    ))
+
+    DTRACE_GEN_OFFSETS_TOOL := $(BUILD_DTRACE_GEN_OFFSETS_TARGET)
+
+    # Argument 1: Output filename
+    # Argument 2: dtrace-gen-offset tool command line option
+    define SetupDtraceOffsetsGeneration
+      $1: $$(BUILD_DTRACE_GEN_OFFSETS)
+	$$(call LogInfo, Generating dtrace $2 file $$(@F))
+	$$(call MakeDir, $$(@D))
+	$$(call ExecuteWithLog, $$@, ( $$(DTRACE_GEN_OFFSETS_TOOL) -$$(strip $2) > $$@ ) )
+
+      TARGETS += $1
+    endef
+
+    JVM_OFFSETS_H := $(DTRACE_GENSRC_DIR)/JvmOffsets.h
+    JVM_OFFSETS_CPP := $(DTRACE_GENSRC_DIR)/JvmOffsets.cpp
+    JVM_OFFSETS_INDEX_H := $(DTRACE_GENSRC_DIR)/JvmOffsetsIndex.h
+
+    ############################################################################
+    # Run the dtrace-gen-offset tool to generate these three files.
+    # The generated JvmOffsets.cpp is compiled with the rest of libjvm.
+    # The header files are used by libjvm_db and jhelper.d, respectively.
+
+    $(eval $(call SetupDtraceOffsetsGeneration, $(JVM_OFFSETS_H), header))
+    $(eval $(call SetupDtraceOffsetsGeneration, $(JVM_OFFSETS_INDEX_H), index))
+    $(eval $(call SetupDtraceOffsetsGeneration, $(JVM_OFFSETS_CPP), table))
+  endif
+
 endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/hotspot/lib/CompileDtraceLibraries.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2013, 2018, 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.
+#
+
+ifeq ($(call check-jvm-feature, dtrace), true)
+  ifeq ($(OPENJDK_TARGET_OS), solaris)
+
+    ############################################################################
+    # Build the stand-alone dtrace libraries.
+
+    LIBJVM_DTRACE_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm_dtrace
+    $(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DTRACE, \
+        NAME := jvm_dtrace, \
+        OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
+        SRC := $(TOPDIR)/src/java.base/solaris/native/libjvm_dtrace, \
+        CFLAGS := -m64 -G -mt -KPIC, \
+        LDFLAGS := -m64 -mt -xnolib $(SHARED_LIBRARY_FLAGS), \
+        LIBS := $(LIBDL) -lthread -ldoor, \
+        MAPFILE := $(TOPDIR)/make/mapfiles/libjvm_dtrace/mapfile-vers, \
+        OBJECT_DIR := $(LIBJVM_DTRACE_OUTPUTDIR)/objs, \
+    ))
+
+    # Note that libjvm_db.c has tests for COMPILER2, but this was never set by
+    # the old build.
+    LIBJVM_DB_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm_db
+    $(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DB, \
+        NAME := jvm_db, \
+        OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
+        SRC := $(TOPDIR)/src/java.base/solaris/native/libjvm_db, \
+        CFLAGS := -I$(DTRACE_GENSRC_DIR) -m64 -G -mt -KPIC, \
+        LDFLAGS := -m64 -mt -xnolib $(SHARED_LIBRARY_FLAGS), \
+        MAPFILE := $(TOPDIR)/make/mapfiles/libjvm_db/mapfile-vers, \
+        OBJECT_DIR := $(LIBJVM_DB_OUTPUTDIR)/objs, \
+    ))
+
+    TARGETS += $(BUILD_LIBJVM_DTRACE) $(BUILD_LIBJVM_DB)
+
+  endif
+endif
--- a/make/hotspot/lib/CompileDtracePostJvm.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-#
-# Copyright (c) 2013, 2018, 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.
-#
-
-################################################################################
-# Support for dtrace integration with libjvm, and stand-alone dtrace library
-# compilation.
-
-ifeq ($(call check-jvm-feature, dtrace), true)
-  ##############################################################################
-
-  ifeq ($(OPENJDK_TARGET_OS), solaris)
-    ############################################################################
-    # Integrate with libjvm. Here we generate three object files which are
-    # linked with libjvm.so. This step is complicated from a dependency
-    # perspective, since it needs the rest of the compiled object files from the
-    # libjvm compilation, but the output is object files that are to be included
-    # when linking libjvm.so. So this generation must happen as a part of the
-    # libjvm compilation.
-
-    # First we need to generate the dtraceGenOffsets tool. When run, this will
-    # produce more header files and a C++ file.
-
-    # Note that generateJvmOffsets.cpp must be compiled as if it were a file
-    # in the libjvm.so, using JVM_CFLAGS as setup in CompileJvm.gmk. Otherwise
-    # this would preferrably have been done as a part of GensrcDtrace.gmk.
-    $(eval $(call SetupNativeCompilation, BUILD_DTRACE_GEN_OFFSETS, \
-        NAME := dtraceGenOffsets, \
-        TYPE := EXECUTABLE, \
-        SRC := $(TOPDIR)/make/hotspot/src/native/dtrace, \
-        TOOLCHAIN := $(TOOLCHAIN_BUILD), \
-        LDFLAGS := -m64, \
-        CFLAGS := -m64 $(JVM_CFLAGS), \
-        OBJECT_DIR := $(JVM_VARIANT_OUTPUTDIR)/tools/dtrace-gen-offsets/objs, \
-        OUTPUT_DIR := $(JVM_VARIANT_OUTPUTDIR)/tools/dtrace-gen-offsets, \
-    ))
-
-    DTRACE_GEN_OFFSETS_TOOL := $(BUILD_DTRACE_GEN_OFFSETS_TARGET)
-
-    # Argument 1: Output filename
-    # Argument 2: dtrace-gen-offset tool command line option
-    define SetupDtraceOffsetsGeneration
-      $1: $$(BUILD_DTRACE_GEN_OFFSETS)
-	$$(call LogInfo, Generating dtrace $2 file $$(@F))
-	$$(call MakeDir, $$(@D))
-	$$(call ExecuteWithLog, $$@, ( $$(DTRACE_GEN_OFFSETS_TOOL) -$$(strip $2) > $$@ ) )
-
-      TARGETS += $1
-    endef
-
-    JVM_OFFSETS_H := $(DTRACE_SUPPORT_DIR)/JvmOffsets.h
-    JVM_OFFSETS_CPP := $(DTRACE_SUPPORT_DIR)/JvmOffsets.cpp
-    JVM_OFFSETS_INDEX_H := $(DTRACE_SUPPORT_DIR)/JvmOffsetsIndex.h
-
-    # Run the dtrace-gen-offset tool to generate these three files.
-    # The generated JvmOffsets.cpp is compiled with the rest of libjvm.
-    $(eval $(call SetupDtraceOffsetsGeneration, $(JVM_OFFSETS_H), header))
-    $(eval $(call SetupDtraceOffsetsGeneration, $(JVM_OFFSETS_INDEX_H), index))
-    $(eval $(call SetupDtraceOffsetsGeneration, $(JVM_OFFSETS_CPP), table))
-
-    ############################################################################
-    # Generate DTRACE_OBJ which is linked with libjvm.so.
-
-    # Concatenate all *.d files into a single file
-    DTRACE_SOURCE_FILES := $(addprefix $(TOPDIR)/src/hotspot/os/posix/dtrace/, \
-        hotspot_jni.d \
-        hotspot.d \
-        hs_private.d \
-    )
-
-    $(JVM_OUTPUTDIR)/objs/dtrace.d: $(DTRACE_SOURCE_FILES)
-	$(call LogInfo, Generating $(@F))
-	$(call MakeDir, $(@D))
-	$(CAT) $^ > $@
-
-    DTRACE_INSTRUMENTED_OBJS := $(addprefix $(JVM_OUTPUTDIR)/objs/, \
-        ciEnv.o \
-        classLoadingService.o \
-        compileBroker.o \
-        hashtable.o \
-        instanceKlass.o \
-        java.o \
-        jni.o \
-        jvm.o \
-        memoryManager.o \
-        nmethod.o \
-        objectMonitor.o \
-        runtimeService.o \
-        sharedRuntime.o \
-        synchronizer.o \
-        thread.o \
-        unsafe.o \
-        vmThread.o \
-        vmGCOperations.o \
-    )
-
-    ifeq ($(call check-jvm-feature, all-gcs), true)
-      DTRACE_INSTRUMENTED_OBJS += $(addprefix $(JVM_OUTPUTDIR)/objs/, \
-          vmCMSOperations.o \
-          vmPSOperations.o \
-      )
-    endif
-
-    DTRACE_FLAGS := -64 -G
-    DTRACE_CPP_FLAGS := -D_LP64
-
-    # Make sure we run our selected compiler for preprocessing instead of letting
-    # the dtrace tool pick it on it's own.
-    $(DTRACE_OBJ): $(JVM_OUTPUTDIR)/objs/dtrace.d $(DTRACE_INSTRUMENTED_OBJS)
-	$(call LogInfo, Generating $(@F) from $(<F) and object files)
-	$(call MakeDir, $(DTRACE_SUPPORT_DIR))
-	$(call ExecuteWithLog, $(DTRACE_SUPPORT_DIR)/$(@F).d, \
-	    ($(CPP) $(DTRACE_CPP_FLAGS) $< > $(DTRACE_SUPPORT_DIR)/$(@F).d))
-	$(call ExecuteWithLog, $@, $(DTRACE) $(DTRACE_FLAGS) -xlazyload -o $@ \
-	    -s $(DTRACE_SUPPORT_DIR)/$(@F).d $(sort $(DTRACE_INSTRUMENTED_OBJS)))
-
-    ############################################################################
-    # Generate DTRACE_JHELPER_OBJ which is linked with libjvm.so.
-
-    # Unfortunately dtrace generates incorrect types for some symbols in
-    # dtrace_jhelper.o, resulting in "warning: symbol X has differing types"
-    # See JDK-6890703 for details.
-    # We work around this by fixing the types for these symbols using elfedit,
-    # after dtrace has generated the .o file.
-    JHELPER_DTRACE_SRC := $(TOPDIR)/src/hotspot/os/solaris/dtrace/jhelper.d
-
-    GetElfeditCommands = \
-      $(foreach symbol, \
-          $(shell $(GREP) ^extern $(JHELPER_DTRACE_SRC) | $(AWK) '{ gsub(";","") ; print $$3 }'), \
-          -e 'sym:st_type $(symbol) 1')
-
-    # Make sure we run our selected compiler for preprocessing instead of letting
-    # the dtrace tool pick it on it's own.
-    $(DTRACE_JHELPER_OBJ): $(JHELPER_DTRACE_SRC) $(JVM_OFFSETS_INDEX_H)
-	$(call LogInfo, Running dtrace for $(<F))
-	$(call MakeDir, $(DTRACE_SUPPORT_DIR))
-	$(call ExecuteWithLog, $(DTRACE_SUPPORT_DIR)/$(@F).d, \
-	    ($(CPP) $(DTRACE_CPP_FLAGS) -I$(DTRACE_SUPPORT_DIR) $^ \
-	    > $(DTRACE_SUPPORT_DIR)/$(@F).d))
-	$(call ExecuteWithLog, $@, $(DTRACE) $(DTRACE_FLAGS) -o $@ \
-	    -s $(DTRACE_SUPPORT_DIR)/$(@F).d)
-        ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc)
-	  $(call ExecuteWithLog, $@.elfedit, $(ELFEDIT) $(call GetElfeditCommands) $@)
-        endif
-
-    ############################################################################
-    # Build the stand-alone dtrace libraries
-
-    LIBJVM_DTRACE_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm_dtrace
-
-    $(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DTRACE, \
-        NAME := jvm_dtrace, \
-        OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
-        SRC := $(TOPDIR)/src/java.base/solaris/native/libjvm_dtrace, \
-        CFLAGS := -m64 -G -mt -KPIC, \
-        LDFLAGS := -m64 -mt -xnolib $(SHARED_LIBRARY_FLAGS), \
-        LIBS := $(LIBDL) -lthread -ldoor, \
-        MAPFILE := $(TOPDIR)/make/mapfiles/libjvm_dtrace/mapfile-vers, \
-        OBJECT_DIR := $(LIBJVM_DTRACE_OUTPUTDIR)/objs, \
-    ))
-
-    LIBJVM_DB_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm_db
-
-    # Note that libjvm_db.c has tests for COMPILER2, but this was never set by
-    # the old build.
-    $(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DB, \
-        NAME := jvm_db, \
-        OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
-        SRC := $(TOPDIR)/src/java.base/solaris/native/libjvm_db, \
-        CFLAGS := -I$(JVM_VARIANT_OUTPUTDIR)/gensrc -I$(DTRACE_SUPPORT_DIR) \
-            -m64 -G -mt -KPIC, \
-        LDFLAGS := -m64 -mt -xnolib $(SHARED_LIBRARY_FLAGS), \
-        MAPFILE := $(TOPDIR)/make/mapfiles/libjvm_db/mapfile-vers, \
-        OBJECT_DIR := $(LIBJVM_DB_OUTPUTDIR)/objs, \
-    ))
-
-    # We need the generated JvmOffsets.h before we can compile the libjvm_db source code.
-    $(BUILD_LIBJVM_DB_ALL_OBJS): $(JVM_OFFSETS_H)
-
-    TARGETS += $(BUILD_LIBJVM_DTRACE) $(BUILD_LIBJVM_DB)
-  endif
-endif
--- a/make/hotspot/lib/CompileDtracePreJvm.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#
-# Copyright (c) 2016, 2018, 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.
-#
-
-ifeq ($(call check-jvm-feature, dtrace), true)
-  ifeq ($(OPENJDK_TARGET_OS), solaris)
-    # These files are are generated by CompileDtrace.gmk but consumed by
-    # CompileJvm.gmk
-    DTRACE_OBJ := $(JVM_OUTPUTDIR)/objs/dtrace.o
-    DTRACE_JHELPER_OBJ := $(JVM_OUTPUTDIR)/objs/dtrace_jhelper.o
-    DTRACE_EXTRA_OBJECT_FILES := $(DTRACE_OBJ) $(DTRACE_JHELPER_OBJ)
-
-    # Since we cannot generate JvmOffsets.cpp as part of the gensrc step,
-    # we need this special hook to get it to compile with the rest of libjvm.
-    JVM_OFFSETS_CPP := $(DTRACE_SUPPORT_DIR)/JvmOffsets.cpp
-    DTRACE_EXTRA_SOURCE_FILES := $(JVM_OFFSETS_CPP)
-  endif
-endif
--- a/make/hotspot/lib/CompileJvm.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/hotspot/lib/CompileJvm.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -24,11 +24,13 @@
 #
 
 # Include support files that will setup compiler flags due to the selected
-# jvm feature set, and specific file overrides.
+# jvm feature set, specific file overrides, and general flags.
 include lib/JvmFeatures.gmk
 include lib/JvmOverrideFiles.gmk
+include lib/JvmFlags.gmk
 
-$(eval $(call IncludeCustomExtension, hotspot/lib/CompileJvm.gmk))
+# Include support files that will setup DTRACE_EXTRA_OBJECT_FILES.
+include lib/JvmDtraceObjects.gmk
 
 ################################################################################
 # Setup compilation of the main Hotspot native library (libjvm).
@@ -39,71 +41,6 @@
 ################################################################################
 # Platform independent setup
 
-# This variable may be added to by a custom extension
-JVM_SRC_ROOTS += $(TOPDIR)/src/hotspot
-
-JVM_SRC_DIRS += $(call uniq, $(wildcard $(foreach d, $(JVM_SRC_ROOTS), \
-        $d/share \
-        $d/os/$(HOTSPOT_TARGET_OS) \
-        $d/os/$(HOTSPOT_TARGET_OS_TYPE) \
-        $d/cpu/$(HOTSPOT_TARGET_CPU_ARCH) \
-        $d/os_cpu/$(HOTSPOT_TARGET_OS)_$(HOTSPOT_TARGET_CPU_ARCH) \
-    ))) \
-    $(JVM_VARIANT_OUTPUTDIR)/gensrc/jvmtifiles \
-    $(JVM_VARIANT_OUTPUTDIR)/gensrc/tracefiles \
-    #
-
-JVM_CFLAGS_INCLUDES += \
-    $(patsubst %,-I%,$(filter-out $(JVM_VARIANT_OUTPUTDIR)/gensrc/%, $(JVM_SRC_DIRS))) \
-    -I$(JVM_VARIANT_OUTPUTDIR)/gensrc \
-    -I$(TOPDIR)/src/hotspot/share/precompiled \
-    -I$(TOPDIR)/src/hotspot/share/include \
-    -I$(TOPDIR)/src/hotspot/os/$(HOTSPOT_TARGET_OS_TYPE)/include \
-    -I$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
-    -I$(SUPPORT_OUTPUTDIR)/modules_include/java.base/$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
-    -I$(TOPDIR)/src/java.base/share/native/libjimage \
-    #
-
-# INCLUDE_SUFFIX_* is only meant for including the proper
-# platform files. Don't use it to guard code. Use the value of
-# HOTSPOT_TARGET_CPU_DEFINE etc. instead.
-# Remaining TARGET_ARCH_* is needed to select the cpu specific
-# sources for 64-bit ARM ports (arm versus aarch64).
-JVM_CFLAGS_TARGET_DEFINES += \
-    -DTARGET_ARCH_$(HOTSPOT_TARGET_CPU_ARCH) \
-    -DINCLUDE_SUFFIX_OS=_$(HOTSPOT_TARGET_OS) \
-    -DINCLUDE_SUFFIX_CPU=_$(HOTSPOT_TARGET_CPU_ARCH) \
-    -DINCLUDE_SUFFIX_COMPILER=_$(HOTSPOT_TOOLCHAIN_TYPE) \
-    -DTARGET_COMPILER_$(HOTSPOT_TOOLCHAIN_TYPE) \
-    -D$(HOTSPOT_TARGET_CPU_DEFINE) \
-    -DHOTSPOT_LIB_ARCH='"$(OPENJDK_TARGET_CPU_LEGACY_LIB)"' \
-    #
-
-ifeq ($(DEBUG_LEVEL), release)
-  # For hotspot, release builds differ internally between "optimized" and "product"
-  # in that "optimize" does not define PRODUCT.
-  ifneq ($(HOTSPOT_DEBUG_LEVEL), optimized)
-    JVM_CFLAGS_DEBUGLEVEL := -DPRODUCT
-  endif
-else ifeq ($(DEBUG_LEVEL), fastdebug)
-  JVM_CFLAGS_DEBUGLEVEL := -DASSERT
-  ifeq ($(filter $(OPENJDK_TARGET_OS), windows aix), )
-    # NOTE: Old build did not define CHECK_UNHANDLED_OOPS on Windows and AIX.
-    JVM_CFLAGS_DEBUGLEVEL += -DCHECK_UNHANDLED_OOPS
-  endif
-else ifeq ($(DEBUG_LEVEL), slowdebug)
-  # _NMT_NOINLINE_ informs NMT that no inlining is done by the compiler
-  JVM_CFLAGS_DEBUGLEVEL := -DASSERT -D_NMT_NOINLINE_
-endif
-
-JVM_CFLAGS += \
-    $(JVM_CFLAGS_DEBUGLEVEL) \
-    $(JVM_CFLAGS_TARGET_DEFINES) \
-    $(JVM_CFLAGS_FEATURES) \
-    $(JVM_CFLAGS_INCLUDES) \
-    $(EXTRA_CFLAGS) \
-    #
-
 JVM_LDFLAGS += \
     $(SHARED_LIBRARY_FLAGS) \
     $(JVM_LDFLAGS_FEATURES) \
@@ -147,11 +84,6 @@
     $(LIBC_DEFINE) \
     #
 
-# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
-ifeq ($(USE_PRECOMPILED_HEADER), false)
-  JVM_CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
-endif
-
 ################################################################################
 # Platform specific setup
 
@@ -219,7 +151,6 @@
     TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
     OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
     SRC := $(JVM_SRC_DIRS), \
-    EXTRA_FILES := $(DTRACE_EXTRA_SOURCE_FILES), \
     EXCLUDES := $(JVM_EXCLUDES), \
     EXCLUDE_FILES := $(JVM_EXCLUDE_FILES), \
     EXCLUDE_PATTERNS := $(JVM_EXCLUDE_PATTERNS), \
--- a/make/hotspot/lib/CompileLibraries.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/hotspot/lib/CompileLibraries.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -31,11 +31,8 @@
 
 include HotspotCommon.gmk
 
-# The dtrace setup must be done both before and after CompileJvm.gmk, due to
-# intricate dependencies.
-include lib/CompileDtracePreJvm.gmk
 include lib/CompileJvm.gmk
-include lib/CompileDtracePostJvm.gmk
+include lib/CompileDtraceLibraries.gmk
 
 ifeq ($(BUILD_GTEST), true)
   include lib/CompileGtest.gmk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/hotspot/lib/JvmDtraceObjects.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,134 @@
+#
+# Copyright (c) 2013, 2018, 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.
+#
+
+ifeq ($(call check-jvm-feature, dtrace), true)
+  ifeq ($(OPENJDK_TARGET_OS), solaris)
+
+    ############################################################################
+    # Integrate with libjvm. Here we generate two object files which are
+    # linked with libjvm.so. This step is complicated from a dependency
+    # perspective. We add these two files to the linking of libjvm using
+    # EXTRA_OBJECT_FILES, but they need to be created outside the call to
+    # SetupNativeCompilation. Also, one of the files is dependent on compiled
+    # object files from the libjvm compilation, so this generation must happen
+    # as a part of the libjvm compilation.
+
+    DTRACE_OBJ := $(JVM_OUTPUTDIR)/objs/dtrace.o
+    DTRACE_JHELPER_OBJ := $(JVM_OUTPUTDIR)/objs/dtrace_jhelper.o
+
+    DTRACE_EXTRA_OBJECT_FILES := $(DTRACE_OBJ) $(DTRACE_JHELPER_OBJ)
+
+    ############################################################################
+    # Generate DTRACE_OBJ which is linked with libjvm.so. It depends on a set of
+    # object files from the compilation.
+
+    # Concatenate all *.d files into a single file
+    DTRACE_SOURCE_FILES := $(addprefix $(TOPDIR)/src/hotspot/os/posix/dtrace/, \
+        hotspot_jni.d \
+        hotspot.d \
+        hs_private.d \
+    )
+
+    $(JVM_OUTPUTDIR)/objs/dtrace.d: $(DTRACE_SOURCE_FILES)
+	$(call LogInfo, Generating $(@F))
+	$(call MakeDir, $(@D))
+	$(CAT) $^ > $@
+
+    DTRACE_INSTRUMENTED_OBJS := $(addprefix $(JVM_OUTPUTDIR)/objs/, \
+        ciEnv.o \
+        classLoadingService.o \
+        compileBroker.o \
+        hashtable.o \
+        instanceKlass.o \
+        java.o \
+        jni.o \
+        jvm.o \
+        memoryManager.o \
+        nmethod.o \
+        objectMonitor.o \
+        runtimeService.o \
+        sharedRuntime.o \
+        synchronizer.o \
+        thread.o \
+        unsafe.o \
+        vmThread.o \
+        vmGCOperations.o \
+    )
+
+    ifeq ($(call check-jvm-feature, all-gcs), true)
+      DTRACE_INSTRUMENTED_OBJS += $(addprefix $(JVM_OUTPUTDIR)/objs/, \
+          vmCMSOperations.o \
+          vmPSOperations.o \
+      )
+    endif
+
+    DTRACE_FLAGS := -64 -G
+    DTRACE_CPP_FLAGS := -D_LP64
+
+    # Make sure we run our selected compiler for preprocessing instead of letting
+    # the dtrace tool pick it on it's own.
+    $(DTRACE_OBJ): $(JVM_OUTPUTDIR)/objs/dtrace.d $(DTRACE_INSTRUMENTED_OBJS)
+	$(call LogInfo, Generating $(@F) from $(<F) and object files)
+	$(call MakeDir, $(DTRACE_SUPPORT_DIR))
+	$(call ExecuteWithLog, $(DTRACE_SUPPORT_DIR)/$(@F).d, \
+	    ($(CPP) $(DTRACE_CPP_FLAGS) $< > $(DTRACE_SUPPORT_DIR)/$(@F).d))
+	$(call ExecuteWithLog, $@, $(DTRACE) $(DTRACE_FLAGS) -xlazyload -o $@ \
+	    -s $(DTRACE_SUPPORT_DIR)/$(@F).d $(sort $(DTRACE_INSTRUMENTED_OBJS)))
+
+    ############################################################################
+    # Generate DTRACE_JHELPER_OBJ which is linked with libjvm.so.
+
+    JHELPER_DTRACE_SRC := $(TOPDIR)/src/hotspot/os/solaris/dtrace/jhelper.d
+
+    # jhelper.d includes JvmOffsetsIndex.h which was created by the gensrc step.
+    DTRACE_GENSRC_DIR := $(JVM_VARIANT_OUTPUTDIR)/gensrc/dtracefiles
+    JVM_OFFSETS_INDEX_H := $(DTRACE_GENSRC_DIR)/JvmOffsetsIndex.h
+
+    # Unfortunately dtrace generates incorrect types for some symbols in
+    # dtrace_jhelper.o, resulting in "warning: symbol X has differing types"
+    # See JDK-6890703 for details.
+    # We work around this by fixing the types for these symbols using elfedit,
+    # after dtrace has generated the .o file.
+    GetElfeditCommands = \
+      $(foreach symbol, \
+          $(shell $(GREP) ^extern $(JHELPER_DTRACE_SRC) | $(AWK) '{ gsub(";","") ; print $$3 }'), \
+          -e 'sym:st_type $(symbol) 1')
+
+    # Make sure we run our selected compiler for preprocessing instead of letting
+    # the dtrace tool pick it on it's own.
+    $(DTRACE_JHELPER_OBJ): $(JHELPER_DTRACE_SRC) $(JVM_OFFSETS_INDEX_H)
+	$(call LogInfo, Running dtrace for $(<F))
+	$(call MakeDir, $(DTRACE_SUPPORT_DIR))
+	$(call ExecuteWithLog, $(DTRACE_SUPPORT_DIR)/$(@F).d, \
+	    ($(CPP) $(DTRACE_CPP_FLAGS) -I$(DTRACE_GENSRC_DIR) $^ \
+	    > $(DTRACE_SUPPORT_DIR)/$(@F).d))
+	$(call ExecuteWithLog, $@, $(DTRACE) $(DTRACE_FLAGS) -o $@ \
+	    -s $(DTRACE_SUPPORT_DIR)/$(@F).d)
+        ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc)
+	  $(call ExecuteWithLog, $@.elfedit, $(ELFEDIT) $(call GetElfeditCommands) $@)
+        endif
+
+  endif
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/hotspot/lib/JvmFlags.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,101 @@
+#
+# Copyright (c) 2013, 2018, 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.
+#
+
+$(eval $(call IncludeCustomExtension, hotspot/lib/JvmFlags.gmk))
+
+################################################################################
+# Setup JVM_CFLAGS. These are shared between GensrcDtrace.gmk and CompileJvm.gmk.
+
+# This variable may be added to by a custom extension
+JVM_SRC_ROOTS += $(TOPDIR)/src/hotspot
+
+JVM_SRC_DIRS += $(call uniq, $(wildcard $(foreach d, $(JVM_SRC_ROOTS), \
+        $d/share \
+        $d/os/$(HOTSPOT_TARGET_OS) \
+        $d/os/$(HOTSPOT_TARGET_OS_TYPE) \
+        $d/cpu/$(HOTSPOT_TARGET_CPU_ARCH) \
+        $d/os_cpu/$(HOTSPOT_TARGET_OS)_$(HOTSPOT_TARGET_CPU_ARCH) \
+    ))) \
+    $(JVM_VARIANT_OUTPUTDIR)/gensrc
+    #
+
+JVM_CFLAGS_INCLUDES += \
+    $(patsubst %,-I%,$(JVM_SRC_DIRS)) \
+    -I$(TOPDIR)/src/hotspot/share/precompiled \
+    -I$(TOPDIR)/src/hotspot/share/include \
+    -I$(TOPDIR)/src/hotspot/os/$(HOTSPOT_TARGET_OS_TYPE)/include \
+    -I$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
+    -I$(SUPPORT_OUTPUTDIR)/modules_include/java.base/$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
+    -I$(TOPDIR)/src/java.base/share/native/libjimage \
+    #
+
+# INCLUDE_SUFFIX_* is only meant for including the proper
+# platform files. Don't use it to guard code. Use the value of
+# HOTSPOT_TARGET_CPU_DEFINE etc. instead.
+# Remaining TARGET_ARCH_* is needed to select the cpu specific
+# sources for 64-bit ARM ports (arm versus aarch64).
+JVM_CFLAGS_TARGET_DEFINES += \
+    -DTARGET_ARCH_$(HOTSPOT_TARGET_CPU_ARCH) \
+    -DINCLUDE_SUFFIX_OS=_$(HOTSPOT_TARGET_OS) \
+    -DINCLUDE_SUFFIX_CPU=_$(HOTSPOT_TARGET_CPU_ARCH) \
+    -DINCLUDE_SUFFIX_COMPILER=_$(HOTSPOT_TOOLCHAIN_TYPE) \
+    -DTARGET_COMPILER_$(HOTSPOT_TOOLCHAIN_TYPE) \
+    -D$(HOTSPOT_TARGET_CPU_DEFINE) \
+    -DHOTSPOT_LIB_ARCH='"$(OPENJDK_TARGET_CPU_LEGACY_LIB)"' \
+    #
+
+ifneq ($(HOTSPOT_TARGET_LIBC),)
+  JVM_CFLAGS_TARGET_DEFINES += -DHOTSPOT_LIBC='"$(HOTSPOT_TARGET_LIBC)"'
+endif
+
+ifeq ($(DEBUG_LEVEL), release)
+  # For hotspot, release builds differ internally between "optimized" and "product"
+  # in that "optimize" does not define PRODUCT.
+  ifneq ($(HOTSPOT_DEBUG_LEVEL), optimized)
+    JVM_CFLAGS_DEBUGLEVEL := -DPRODUCT
+  endif
+else ifeq ($(DEBUG_LEVEL), fastdebug)
+  JVM_CFLAGS_DEBUGLEVEL := -DASSERT
+  ifeq ($(filter $(OPENJDK_TARGET_OS), windows aix), )
+    # NOTE: Old build did not define CHECK_UNHANDLED_OOPS on Windows and AIX.
+    JVM_CFLAGS_DEBUGLEVEL += -DCHECK_UNHANDLED_OOPS
+  endif
+else ifeq ($(DEBUG_LEVEL), slowdebug)
+  # _NMT_NOINLINE_ informs NMT that no inlining is done by the compiler
+  JVM_CFLAGS_DEBUGLEVEL := -DASSERT -D_NMT_NOINLINE_
+endif
+
+JVM_CFLAGS += \
+    $(JVM_CFLAGS_DEBUGLEVEL) \
+    $(JVM_CFLAGS_TARGET_DEFINES) \
+    $(JVM_CFLAGS_FEATURES) \
+    $(JVM_CFLAGS_INCLUDES) \
+    $(EXTRA_CFLAGS) \
+    #
+
+# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
+ifeq ($(USE_PRECOMPILED_HEADER), false)
+  JVM_CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
+endif
--- a/make/hotspot/src/native/dtrace/generateJvmOffsets.cpp	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/hotspot/src/native/dtrace/generateJvmOffsets.cpp	Thu Apr 12 13:28:52 2018 -0700
@@ -31,29 +31,23 @@
  * GENOFFS_SCCS_VER 34
  */
 
-#include "generateJvmOffsets.h"
+#include <stdio.h>
+#include <strings.h>
 
 /* A workaround for private and protected fields */
 #define private   public
 #define protected public
 
 #include <proc_service.h>
-#include "code/codeBlob.hpp"
-#include "code/nmethod.hpp"
-#include "code/pcDesc.hpp"
 #include "gc/shared/collectedHeap.hpp"
-#include "memory/heap.hpp"
-#include "memory/memRegion.hpp"
-#include "memory/universe.hpp"
-#include "memory/virtualspace.hpp"
-#include "oops/constMethod.hpp"
-#include "oops/klass.hpp"
-#include "oops/method.hpp"
-#include "oops/oop.hpp"
-#include "oops/symbol.hpp"
 #include "runtime/vmStructs.hpp"
-#include "utilities/accessFlags.hpp"
-#include "utilities/globalDefinitions.hpp"
+
+typedef enum GEN_variant {
+        GEN_OFFSET = 0,
+        GEN_INDEX  = 1,
+        GEN_TABLE  = 2
+} GEN_variant;
+
 #ifdef COMPILER1
 #ifdef ASSERT
 
--- a/make/hotspot/src/native/dtrace/generateJvmOffsets.h	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2003, 2010, 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.
- *
- */
-
-#ifndef OS_SOLARIS_DTRACE_GENERATEJVMOFFSETS_H
-#define OS_SOLARIS_DTRACE_GENERATEJVMOFFSETS_H
-
-#include <stdio.h>
-#include <strings.h>
-
-typedef enum GEN_variant {
-        GEN_OFFSET = 0,
-        GEN_INDEX  = 1,
-        GEN_TABLE  = 2
-} GEN_variant;
-
-extern "C" {
-        int generateJvmOffsets(GEN_variant gen_var);
-        void gen_prologue(GEN_variant gen_var);
-        void gen_epilogue(GEN_variant gen_var);
-}
-
-#endif // OS_SOLARIS_DTRACE_GENERATEJVMOFFSETS_H
--- a/make/jdk/netbeans/jmx/build.properties	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/jdk/netbeans/jmx/build.properties	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -34,8 +34,7 @@
     javax/management/ \
     org/omg/stub/javax/management/
 
-excludes=\
-    com/sun/jmx/snmp/
+excludes=
 
 jtreg.tests=\
     com/sun/jmx/ \
--- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, 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
@@ -28,16 +28,15 @@
 import static build.tools.cldrconverter.Bundle.jreTimeZoneNames;
 import build.tools.cldrconverter.BundleGenerator.BundleType;
 import java.io.File;
-import java.nio.file.DirectoryStream;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
+import java.nio.file.*;
+import java.time.*;
 import java.util.*;
 import java.util.ResourceBundle.Control;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+import java.util.stream.Stream;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import org.xml.sax.SAXNotRecognizedException;
@@ -56,12 +55,13 @@
     static final String BCP47_LDML_DTD_SYSTEM_ID = "http://www.unicode.org/cldr/dtd/2.0/ldmlBCP47.dtd";
 
 
-    private static String CLDR_BASE = "../CLDR/21.0.1/";
+    private static String CLDR_BASE;
     static String LOCAL_LDML_DTD;
     static String LOCAL_SPPL_LDML_DTD;
     static String LOCAL_BCP47_LDML_DTD;
     private static String SOURCE_FILE_DIR;
     private static String SPPL_SOURCE_FILE;
+    private static String SPPL_META_SOURCE_FILE;
     private static String NUMBERING_SOURCE_FILE;
     private static String METAZONES_SOURCE_FILE;
     private static String LIKELYSUBTAGS_SOURCE_FILE;
@@ -85,6 +85,7 @@
     static final String PARENT_LOCALE_PREFIX = "parentLocale.";
 
     private static SupplementDataParseHandler handlerSuppl;
+    private static SupplementalMetadataParseHandler handlerSupplMeta;
     private static LikelySubtagsParseHandler handlerLikelySubtags;
     static NumberingSystemsParseHandler handlerNumbering;
     static MetaZonesParseHandler handlerMetaZones;
@@ -100,6 +101,9 @@
     private static final ResourceBundle.Control defCon =
         ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT);
 
+    private static final String[] AVAILABLE_TZIDS = TimeZone.getAvailableIDs();
+    private static String zoneNameTempFile;
+
     static enum DraftType {
         UNCONFIRMED,
         PROVISIONAL,
@@ -195,6 +199,10 @@
                         verbose = true;
                         break;
 
+                    case "-zntempfile":
+                        zoneNameTempFile = args[++i];
+                        break;
+
                     case "-help":
                         usage();
                         System.exit(0);
@@ -221,6 +229,7 @@
         NUMBERING_SOURCE_FILE = CLDR_BASE + "/supplemental/numberingSystems.xml";
         METAZONES_SOURCE_FILE = CLDR_BASE + "/supplemental/metaZones.xml";
         TIMEZONE_SOURCE_FILE = CLDR_BASE + "/bcp47/timezone.xml";
+        SPPL_META_SOURCE_FILE = CLDR_BASE + "/supplemental/supplementalMetadata.xml";
 
         if (BASE_LOCALES.isEmpty()) {
             setupBaseLocales("en-US");
@@ -234,6 +243,11 @@
 
         List<Bundle> bundles = readBundleList();
         convertBundles(bundles);
+
+        // Generate java.time.format.ZoneName.java
+        if (isBaseModule) {
+            generateZoneName();
+        }
     }
 
     private static void usage() {
@@ -246,7 +260,7 @@
                 + "\t-basemodule    generates bundles that go into java.base module%n"
                 + "\t-baselocales loc(,loc)*      locales that go into the base module%n"
                 + "\t-o dir         output directory (default: ./build/gensrc)%n"
-                + "\t-o dir         output directory (defaut: ./build/gensrc)%n"
+                + "\t-zntempfile    template file for java.time.format.ZoneName.java%n"
                 + "\t-utf8          use UTF-8 rather than \\uxxxx (for debug)%n");
     }
 
@@ -401,6 +415,11 @@
         // Parse likelySubtags
         handlerLikelySubtags = new LikelySubtagsParseHandler();
         parseLDMLFile(new File(LIKELYSUBTAGS_SOURCE_FILE), handlerLikelySubtags);
+
+        // Parse supplementalMetadata
+        // Currently only interested in deprecated time zone ids.
+        handlerSupplMeta = new SupplementalMetadataParseHandler();
+        parseLDMLFile(new File(SPPL_META_SOURCE_FILE), handlerSupplMeta);
     }
 
     // Parsers for data in "bcp47" directory
@@ -656,13 +675,16 @@
             });
         }
 
-        for (String tzid : handlerMetaZones.keySet()) {
-            String tzKey = TIMEZONE_ID_PREFIX + tzid;
-            Object data = map.get(tzKey);
+        Arrays.stream(AVAILABLE_TZIDS).forEach(tzid -> {
+            // If the tzid is deprecated, get the data for the replacement id
+            String tzKey = Optional.ofNullable((String)handlerSupplMeta.get(tzid))
+                                   .orElse(tzid);
+            Object data = map.get(TIMEZONE_ID_PREFIX + tzKey);
+
             if (data instanceof String[]) {
                 names.put(tzid, data);
             } else {
-                String meta = handlerMetaZones.get(tzid);
+                String meta = handlerMetaZones.get(tzKey);
                 if (meta != null) {
                     String metaKey = METAZONE_ID_PREFIX + meta;
                     data = map.get(metaKey);
@@ -673,7 +695,8 @@
                     }
                 }
             }
-        }
+        });
+
         return names;
     }
 
@@ -948,4 +971,44 @@
 
         return candidates;
     }
+
+    private static void generateZoneName() throws Exception {
+        Files.createDirectories(Paths.get(DESTINATION_DIR, "java", "time", "format"));
+        Files.write(Paths.get(DESTINATION_DIR, "java", "time", "format", "ZoneName.java"),
+            Files.lines(Paths.get(zoneNameTempFile))
+                .flatMap(l -> {
+                    if (l.equals("%%%%ZIDMAP%%%%")) {
+                        return zidMapEntry();
+                    } else if (l.equals("%%%%MZONEMAP%%%%")) {
+                        return handlerMetaZones.mzoneMapEntry();
+                    } else if (l.equals("%%%%DEPRECATED%%%%")) {
+                        return handlerSupplMeta.deprecatedMap();
+                    } else {
+                        return Stream.of(l);
+                    }
+                })
+                .collect(Collectors.toList()),
+            StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
+    }
+
+    private static Stream<String> zidMapEntry() {
+        Map<String, String> canonMap = new HashMap<>();
+        handlerTimeZone.getData().entrySet().stream()
+            .forEach(e -> {
+                String[] ids = ((String)e.getValue()).split("\\s");
+                for (int i = 1; i < ids.length; i++) {
+                    canonMap.put(ids[i], ids[0]);
+                }});
+        return ZoneId.getAvailableZoneIds().stream()
+                .map(id -> {
+                    String canonId = canonMap.getOrDefault(id, id);
+                    String meta = handlerMetaZones.get(canonId);
+                    String zone001 = handlerMetaZones.zidMap().get(meta);
+                    return zone001 == null ? "" :
+                            String.format("        \"%s\", \"%s\", \"%s\",",
+                                            id, meta, zone001);
+                })
+                .filter(s -> !s.isEmpty())
+                .sorted();
+    }
 }
--- a/make/jdk/src/classes/build/tools/cldrconverter/MetaZonesParseHandler.java	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/jdk/src/classes/build/tools/cldrconverter/MetaZonesParseHandler.java	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,9 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.*;
+import java.util.stream.*;
+
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -34,6 +37,10 @@
 class MetaZonesParseHandler extends AbstractLDMLHandler<String> {
     private String tzid, metazone;
 
+    // for java.time.format.ZoneNames.java
+    private List<String> mzoneMapEntryList = new ArrayList<>();
+    private Map<String, String> zones = new HashMap<>();
+
     MetaZonesParseHandler() {
     }
 
@@ -64,6 +71,19 @@
             pushIgnoredContainer(qName);
             break;
 
+        case "mapZone":
+            String territory = attributes.getValue("territory");
+            if (territory.equals("001")) {
+                zones.put(attributes.getValue("other"), attributes.getValue("type"));
+            } else {
+                mzoneMapEntryList.add(String.format("        \"%s\", \"%s\", \"%s\",",
+                    attributes.getValue("other"),
+                    territory,
+                    attributes.getValue("type")));
+            }
+            pushIgnoredContainer(qName);
+            break;
+
         case "version":
         case "generation":
             pushIgnoredContainer(qName);
@@ -89,4 +109,12 @@
         }
         currentContainer = currentContainer.getParent();
     }
+
+    public Map<String, String> zidMap() {
+        return zones;
+    }
+
+    public Stream<String> mzoneMapEntry() {
+        return mzoneMapEntryList.stream();
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/jdk/src/classes/build/tools/cldrconverter/SupplementalMetadataParseHandler.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.cldrconverter;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.stream.Stream;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Handles parsing of files in Locale Data Markup Language for
+ * SupplementalMetadata.xml
+ */
+
+class SupplementalMetadataParseHandler extends AbstractLDMLHandler<Object> {
+    @Override
+    public InputSource resolveEntity(String publicID, String systemID) throws IOException, SAXException {
+        // avoid HTTP traffic to unicode.org
+        if (systemID.startsWith(CLDRConverter.SPPL_LDML_DTD_SYSTEM_ID)) {
+            return new InputSource((new File(CLDRConverter.LOCAL_SPPL_LDML_DTD)).toURI().toString());
+        }
+        return null;
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+        switch (qName) {
+        case "zoneAlias":
+            String reason = attributes.getValue("reason");
+            if ("deprecated".equals(reason)) {
+                put(attributes.getValue("type"), attributes.getValue("replacement"));
+            }
+            pushIgnoredContainer(qName);
+            break;
+        default:
+            // treat anything else as a container
+            pushContainer(qName, attributes);
+            break;
+        }
+    }
+
+    public Stream<String> deprecatedMap() {
+        return keySet().stream()
+                .map(k -> String.format("        \"%s\", \"%s\",", k, get(k)))
+                .sorted();
+    }
+}
--- a/make/launcher/Launcher-jdk.pack.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/launcher/Launcher-jdk.pack.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -34,6 +34,25 @@
 # The order of the object files on the link command line affects the size of the resulting
 # binary (at least on linux) which causes the size to differ between old and new build.
 
+# Tell the compiler not to export any functions unless declared so in
+# the source code. On Windows, this is the default and cannot be changed.
+# On Mac, we have always exported all symbols, probably due to oversight
+# and/or misunderstanding. To emulate this, don't hide any symbols
+# by default.
+# Also provide an override for non-conformant libraries.
+ifeq ($(TOOLCHAIN_TYPE), gcc)
+  CXXFLAGS_JDKEXE += -fvisibility=hidden
+  LDFLAGS_JDKEXE += -Wl,--exclude-libs,ALL
+else ifeq ($(TOOLCHAIN_TYPE), clang)
+  ifneq ($(OPENJDK_TARGET_OS), macosx)
+    CXXFLAGS_JDKEXE += -fvisibility=hidden
+  endif
+else ifeq ($(TOOLCHAIN_TYPE), solstudio)
+  CXXFLAGS_JDKEXE += -xldscope=hidden
+else ifeq ($(TOOLCHAIN_TYPE), xlc)
+  CXXFLAGS_JDKEXE += -qvisibility=hidden
+endif
+
 UNPACKEXE_SRC := $(TOPDIR)/src/jdk.pack/share/native/common-unpack \
     $(TOPDIR)/src/jdk.pack/share/native/unpack200
 UNPACKEXE_CFLAGS := -I$(TOPDIR)/src/jdk.pack/share/native/common-unpack \
@@ -58,21 +77,6 @@
 
 endif
 
-UNPACK_MAPFILE_DIR := $(TOPDIR)/make/mapfiles/libunpack
-UNPACK_MAPFILE_PLATFORM_FILE := \
-    $(UNPACK_MAPFILE_DIR)/mapfile-vers-unpack200-$(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_ARCH)
-
-# The linker on older SuSE distros (e.g. on SLES 10) complains with:
-# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
-# if feeded with a version script which contains named tags.
-ifeq ($(USING_BROKEN_SUSE_LD), yes)
-  UNPACK_MAPFILE := $(UNPACK_MAPFILE_DIR)/mapfile-vers-unpack200.anonymous
-else ifneq ($(wildcard $(UNPACK_MAPFILE_PLATFORM_FILE)), )
-  UNPACK_MAPFILE := $(UNPACK_MAPFILE_PLATFORM_FILE)
-else
-  UNPACK_MAPFILE := $(UNPACK_MAPFILE_DIR)/mapfile-vers-unpack200
-endif
-
 $(eval $(call SetupJdkExecutable, BUILD_UNPACKEXE, \
     NAME := unpack200, \
     SRC := $(UNPACKEXE_SRC), \
@@ -84,7 +88,7 @@
     CFLAGS_solaris := -KPIC, \
     CFLAGS_macosx := -fPIC, \
     DISABLED_WARNINGS_gcc := unused-result implicit-fallthrough, \
-    MAPFILE := $(UNPACK_MAPFILE),\
+    DISABLED_WARNINGS_microsoft := 4005, \
     LDFLAGS := $(UNPACKEXE_ZIPOBJS) \
         $(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \
         $(call SET_SHARED_LIBRARY_ORIGIN), \
--- a/make/launcher/LauncherCommon.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/launcher/LauncherCommon.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -26,11 +26,9 @@
 include JdkNativeCompilation.gmk
 
 ifeq ($(OPENJDK_TARGET_OS), macosx)
-  DISABLE_MAPFILES := true
   ORIGIN_ARG := $(call SET_EXECUTABLE_ORIGIN)
 else
   ifeq ($(OPENJDK_TARGET_OS), windows)
-    DISABLE_MAPFILES := true
   endif
   ORIGIN_ARG := $(call SET_EXECUTABLE_ORIGIN,/../lib/jli)
 
@@ -42,8 +40,27 @@
   endif
 endif
 
+# Tell the compiler not to export any functions unless declared so in
+# the source code. On Windows, this is the default and cannot be changed.
+# On Mac, we have always exported all symbols, probably due to oversight
+# and/or misunderstanding. To emulate this, don't hide any symbols
+# by default.
+# Also provide an override for non-conformant libraries.
+ifeq ($(TOOLCHAIN_TYPE), gcc)
+  LAUNCHER_CFLAGS += -fvisibility=hidden
+  LDFLAGS_JDKEXE += -Wl,--exclude-libs,ALL
+else ifeq ($(TOOLCHAIN_TYPE), clang)
+  ifneq ($(OPENJDK_TARGET_OS), macosx)
+    LAUNCHER_CFLAGS += -fvisibility=hidden
+  endif
+else ifeq ($(TOOLCHAIN_TYPE), solstudio)
+  LAUNCHER_CFLAGS += -xldscope=hidden
+else ifeq ($(TOOLCHAIN_TYPE), xlc)
+  LAUNCHER_CFLAGS += -qvisibility=hidden
+endif
+
 LAUNCHER_SRC := $(TOPDIR)/src/java.base/share/native/launcher
-LAUNCHER_CFLAGS := -I$(TOPDIR)/src/java.base/share/native/launcher \
+LAUNCHER_CFLAGS += -I$(TOPDIR)/src/java.base/share/native/launcher \
     -I$(TOPDIR)/src/java.base/share/native/libjli \
     -I$(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/libjli \
     -I$(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS)/native/libjli \
@@ -157,23 +174,6 @@
     $1_WINDOWS_JLI_LIB := $(SUPPORT_OUTPUTDIR)/native/java.base/libjli/jli.lib
   endif
 
-  # The linker on older SuSE distros (e.g. on SLES 10) complains with:
-  # "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
-  # if feeded with a version script which contains named tags.
-  ifeq ($(USING_BROKEN_SUSE_LD),yes)
-    ifneq ($(wildcard $(TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU).anonymous), )
-      $1_MAPFILE := $(TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU).anonymous
-    else
-      $1_MAPFILE :=
-    endif
-  else
-    ifneq ($(wildcard $(TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)), )
-      $1_MAPFILE := $(TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)
-    else
-      $1_MAPFILE :=
-    endif
-  endif
-
   $$(eval $$(call SetupJdkExecutable, BUILD_LAUNCHER_$1, \
       NAME := $1, \
       EXTRA_FILES := $(LAUNCHER_SRC)/main.c, \
@@ -194,7 +194,6 @@
           -L$(SUPPORT_OUTPUTDIR)/modules_libs/java.base/jli, \
       LDFLAGS_solaris := $$($1_LDFLAGS_solaris) \
           -L$(SUPPORT_OUTPUTDIR)/modules_libs/java.base/jli, \
-      MAPFILE := $$($1_MAPFILE), \
       LIBS := $(JDKEXE_LIBS) $$($1_LIBS), \
       LIBS_unix := $$($1_LIBS_unix), \
       LIBS_linux := -lpthread -ljli $(LIBDL), \
--- a/make/lib/Awt2dLibraries.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/lib/Awt2dLibraries.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -543,7 +543,7 @@
       DISABLED_WARNINGS_solstudio := \
          E_STATEMENT_NOT_REACHED \
          E_END_OF_LOOP_CODE_NOT_REACHED, \
-      DISABLED_WARNINGS_microsoft := 4267 2220 4244, \
+      DISABLED_WARNINGS_microsoft := 4267 4244 4312, \
       LDFLAGS := $(LDFLAGS_JDKLIB) \
           $(call SET_SHARED_LIBRARY_ORIGIN), \
   ))
@@ -651,10 +651,11 @@
     LDFLAGS := $(subst -Wl$(COMMA)-z$(COMMA)defs,,$(LDFLAGS_JDKLIB)) $(LDFLAGS_CXX_JDK) \
         $(call SET_SHARED_LIBRARY_ORIGIN), \
     LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \
-    LDFLAGS_macosx := -undefined dynamic_lookup, \
     LIBS := $(BUILD_LIBFONTMANAGER_FONTLIB), \
     LIBS_unix := -lawt -ljava -ljvm $(LIBM) $(LIBCXX), \
-    LIBS_aix := -lawt_headless,\
+    LIBS_aix := -lawt_headless, \
+    LIBS_macosx := -lawt_lwawt -framework CoreText -framework CoreFoundation \
+        -framework CoreGraphics, \
     LIBS_windows := $(WIN_JAVA_LIB) advapi32.lib user32.lib gdi32.lib \
         $(WIN_AWT_LIB), \
 ))
@@ -665,6 +666,10 @@
   $(BUILD_LIBFONTMANAGER): $(BUILD_LIBAWT_HEADLESS)
 endif
 
+ifeq ($(OPENJDK_TARGET_OS), macosx)
+  $(BUILD_LIBFONTMANAGER): $(call FindLib, java.desktop, awt_lwawt)
+endif
+
 ifeq ($(FREETYPE_TO_USE), bundled)
   $(BUILD_LIBFONTMANAGER): $(BUILD_LIBFREETYPE)
 endif
@@ -993,6 +998,7 @@
           -I$(TOPDIR)/src/java.base/share/native/libjava \
           -I$(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/libjava \
           -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop,  \
+      DISABLED_WARNINGS_clang := deprecated-declarations, \
       LDFLAGS := $(LDFLAGS_JDKLIB) \
           $(call SET_SHARED_LIBRARY_ORIGIN) \
           -Wl$(COMMA)-rpath$(COMMA)@loader_path \
--- a/make/lib/Lib-java.base.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/lib/Lib-java.base.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -155,10 +155,10 @@
 ################################################################################
 # Create the jsig library
 
-ifneq ($(OPENJDK_TARGET_OS), windows)
+ifeq ($(OPENJDK_TARGET_OS_TYPE), unix)
   ifeq ($(STATIC_BUILD), false)
 
-    LIBJSIG_SRC_DIR := $(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS)/native/libjsig
+    LIBJSIG_SRC_DIR := $(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/libjsig
     LIBJSIG_MAPFILE := $(wildcard $(TOPDIR)/make/mapfiles/libjsig/mapfile-vers-$(OPENJDK_TARGET_OS))
 
     ifeq ($(OPENJDK_TARGET_OS), linux)
--- a/make/lib/Lib-java.desktop.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/lib/Lib-java.desktop.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -50,6 +50,7 @@
 
   LIBJSOUND_CFLAGS := \
       -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop \
+      $(ALSA_CFLAGS) \
       $(LIBJAVA_HEADER_FLAGS) \
       $(foreach dir, $(LIBJSOUND_SRC_DIRS), -I$(dir)) \
       -DX_PLATFORM=X_$(OPENJDK_TARGET_OS_UPPERCASE) \
@@ -105,7 +106,8 @@
       CFLAGS := $(CFLAGS_JDKLIB) \
           $(addprefix -I, $(LIBOSXAPP_SRC)) \
           -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop, \
-      DISABLED_WARNINGS_clang := objc-method-access objc-root-class, \
+      DISABLED_WARNINGS_clang := objc-method-access objc-root-class \
+          deprecated-declarations, \
       LDFLAGS := $(LDFLAGS_JDKLIB) \
           $(call SET_SHARED_LIBRARY_ORIGIN), \
       LIBS := \
--- a/make/lib/Lib-jdk.accessibility.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/lib/Lib-jdk.accessibility.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -45,6 +45,7 @@
         NAME := javaaccessbridge$1, \
         SRC := $(JAVA_AB_SRCDIR), \
         OPTIMIZATION := LOW, \
+        DISABLED_WARNINGS_microsoft := 4311 4302 4312, \
         CFLAGS := $(CFLAGS_JDKLIB) $(ACCESSBRIDGE_CFLAGS) \
             $(addprefix -I,$(JAVA_AB_SRCDIR)) \
             -I$(ROOT_SRCDIR)/include/bridge \
@@ -69,6 +70,7 @@
         NAME := windowsaccessbridge$1, \
         SRC := $(WIN_AB_SRCDIR), \
         OPTIMIZATION := LOW, \
+        DISABLED_WARNINGS_microsoft := 4311 4302 4312, \
         CFLAGS := $(filter-out -MD, $(CFLAGS_JDKLIB)) -MT $(ACCESSBRIDGE_CFLAGS) \
             $(addprefix -I,$(WIN_AB_SRCDIR)) \
             -I$(ROOT_SRCDIR)/include/bridge \
--- a/make/lib/Lib-jdk.pack.gmk	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/lib/Lib-jdk.pack.gmk	Thu Apr 12 13:28:52 2018 -0700
@@ -40,6 +40,7 @@
         $(LIBJAVA_HEADER_FLAGS), \
     CFLAGS_release := -DPRODUCT, \
     DISABLED_WARNINGS_gcc := implicit-fallthrough, \
+    DISABLED_WARNINGS_microsoft := 4005, \
     LDFLAGS := $(LDFLAGS_JDKLIB) $(LDFLAGS_CXX_JDK) \
         $(call SET_SHARED_LIBRARY_ORIGIN), \
     LDFLAGS_windows := -map:$(SUPPORT_OUTPUTDIR)/native/$(MODULE)/unpack.map -debug, \
--- a/make/mapfiles/launchers/mapfile-ppc64	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#
-# Copyright (c) 2004, 2012, 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.
-#
-#
-# Specify what global symbols we export.  Note that we're not really
-# interested in declaring a version, simply scoping the file is sufficient.
-#
-
-SUNWprivate_1.1 {
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-
-	local:
-		*;
-};
--- a/make/mapfiles/launchers/mapfile-ppc64.anonymous	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#
-# Copyright (c) 2004, 2012, 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.
-#
-#
-# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because
-# the linker on older SuSE distros (e.g. on SLES 10) complains with:
-# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
-# if feeded with a version script which contains named tags.
-
-{
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-
-	local:
-		*;
-};
--- a/make/mapfiles/launchers/mapfile-sparc	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-#
-# Copyright (c) 2004, 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.  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.
-#
-# Specify what global symbols we export.  Note that we're not really
-# interested in declaring a version, simply scoping the file is sufficient.
-#
-
-SUNWprivate_1.1 {
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-		___Argv;	# The following are private, but as they are
-		_start;		# exported from ctr1/crtn, the clever hacker
-		_init;		# might know about them.  However note, that
-		_fini;		# their use is strictly not supported.
-		_lib_version;
-		__cg92_used;
-		__xargc;
-		__xargv;
-		__fsr_init_value;
-
-	local:
-		*;
-};
--- a/make/mapfiles/launchers/mapfile-sparcv9	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#
-# Copyright (c) 2004, 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.  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.
-#
-
-#
-# Specify what global symbols we export.  Note that we're not really
-# interested in declaring a version, simply scoping the file is sufficient.
-#
-
-SUNWprivate_1.1 {
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-		___Argv;	# The following are private, but as they are
-		_start;		# exported from ctr1/crtn, the clever hacker
-		_init;		# might know about them.  However note, that
-		_fini;		# their use is strictly not supported.
-		_lib_version;
-		__xargc;
-		__xargv;
-		__fsr_init_value;
-
-	local:
-		*;
-};
--- a/make/mapfiles/launchers/mapfile-x86	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#
-# Copyright (c) 2004, 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.  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.
-#
-#
-# Specify what global symbols we export.  Note that we're not really
-# interested in declaring a version, simply scoping the file is sufficient.
-#
-
-SUNWprivate_1.1 {
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-		___Argv;	# The following are private, but as they are
-		_start;		# exported from ctr1/crtn, the clever hacker
-		_init;		# might know about them.  However note, that
-		_fini;		# their use is strictly not supported.
-		_lib_version;
-#		_mcount;
-		__fsr;
-		__fsr_init_value;
-		__longdouble_used;
-
-	local:
-		*;
-};
--- a/make/mapfiles/launchers/mapfile-x86.anonymous	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#
-# Copyright (c) 2004, 2012, 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.
-#
-#
-# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because
-# the linker on older SuSE distros (e.g. on SLES 10) complains with:
-# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
-# if feeded with a version script which contains named tags.
-
-{
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-		___Argv;	# The following are private, but as they are
-		_start;		# exported from ctr1/crtn, the clever hacker
-		_init;		# might know about them.  However note, that
-		_fini;		# their use is strictly not supported.
-		_lib_version;
-#		_mcount;
-		__fsr;
-		__fsr_init_value;
-		__longdouble_used;
-
-	local:
-		*;
-};
--- a/make/mapfiles/launchers/mapfile-x86_64	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-#
-# Copyright (c) 2004, 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.  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.
-#
-#
-# Specify what global symbols we export.  Note that we're not really
-# interested in declaring a version, simply scoping the file is sufficient.
-#
-
-SUNWprivate_1.1 {
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-
-		# These are needed by the c runtime in SS12u4
-		___Argv;
-		__xargv;
-		__xargc;
-		_start;
-		__longdouble_used;
-		_lib_version;
-
-	local:
-		*;
-};
--- a/make/mapfiles/launchers/mapfile-x86_64.anonymous	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#
-# Copyright (c) 2004, 2012, 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.
-#
-#
-# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because
-# the linker on older SuSE distros (e.g. on SLES 10) complains with:
-# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
-# if feeded with a version script which contains named tags.
-
-{
-	global:
-		main;		# Provides basic adb symbol offsets
-		environ;	# Public symbols and required by Java run time
-		_environ;
-		__environ_lock;
-
-	local:
-		*;
-};
--- a/make/mapfiles/libjsig/mapfile-vers-solaris	Mon Apr 09 11:10:52 2018 +0200
+++ b/make/mapfiles/libjsig/mapfile-vers-solaris	Thu Apr 12 13:28:52 2018 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2018, 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
@@ -28,7 +28,6 @@
         global:
             JVM_begin_signal_setting;
             JVM_end_signal_setting;
-            JVM_get_libjsig_version;
             JVM_get_signal_action;
             sigaction;
             signal;
--- a/make/mapfiles/libunpack/mapfile-vers-unpack200	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-#
-# Copyright (c) 2011, 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.  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.
-#
-
-# Define library interface.
-
-SUNWprivate_1.1 {
-	local:
-	    *;
-};
--- a/make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-sparc	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#
-# Copyright (c) 2011, 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.  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.
-#
-
-# Define library interface.
-
-SUNWprivate_1.1 {
-	global:
-		# These are needed by the c runtime in SS12u4
-		environ;
-		_environ;
-		__environ_lock;
-		___Argv;
-		__xargv;
-		__xargc;
-		_start;
-		_lib_version;
-
-	local:
-	    *;
-};
--- a/make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-x86	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-#
-# Copyright (c) 2011, 2018, 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.
-#
-
-# Define library interface.
-
-SUNWprivate_1.1 {
-	global:
-		# These are needed by the c runtime in SS12u4
-		environ;
-		_environ;
-		__environ_lock;
-		___Argv;
-		__xargv;
-		__xargc;
-		_start;
-		__longdouble_used;
-		_lib_version;
-
-	local:
-	    *;
-};
--- a/make/mapfiles/libunpack/mapfile-vers-unpack200.anonymous	Mon Apr 09 11:10:52 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-#
-# Copyright (c) 2011, 2012, 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.
-#
-
-# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because
-# the linker on older SuSE distros (e.g. on SLES 10) complains with:
-# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
-# if feeded with a version script which contains named tags.
-
-{
-	local:
-	    *;
-};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/AquaTheme.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a theme using "blue-green" colors.
+ *
+ * @author Steve Wilson
+ */
+public class AquaTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Aqua"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(102, 153, 153);
+    private final ColorUIResource primary2 = new ColorUIResource(128, 192, 192);
+    private final ColorUIResource primary3 = new ColorUIResource(159, 235, 235);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/BezierAnimationPanel.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,331 @@
+/*
+ *
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+import java.awt.image.*;
+import java.awt.event.*;
+
+/**
+ * BezierAnimationPanel
+ *
+ * @author Jim Graham
+ * @author Jeff Dinkins (removed dynamic setting changes, made swing friendly)
+ */
+class BezierAnimationPanel extends JPanel implements Runnable {
+
+    Color backgroundColor =  new Color(0,     0, 153);
+    Color outerColor      =  new Color(255, 255, 255);
+    Color gradientColorA  =  new Color(255,   0, 101);
+    Color gradientColorB  =  new Color(255, 255,   0);
+
+    boolean bgChanged = false;
+
+    GradientPaint gradient = null;
+
+    public final int NUMPTS = 6;
+
+    float animpts[] = new float[NUMPTS * 2];
+
+    float deltas[] = new float[NUMPTS * 2];
+
+    float staticpts[] = {
+         50.0f,   0.0f,
+        150.0f,   0.0f,
+        200.0f,  75.0f,
+        150.0f, 150.0f,
+         50.0f, 150.0f,
+          0.0f,  75.0f,
+    };
+
+    float movepts[] = new float[staticpts.length];
+
+    BufferedImage img;
+
+    Rectangle bounds = null;
+
+    Thread anim;
+
+    private final Object lock = new Object();
+
+    /**
+     * BezierAnimationPanel Constructor
+     */
+    public BezierAnimationPanel() {
+        addHierarchyListener(
+            new HierarchyListener() {
+               public void hierarchyChanged(HierarchyEvent e) {
+                   if(isShowing()) {
+                       start();
+                   } else {
+                       stop();
+                   }
+               }
+           }
+        );
+        setBackground(getBackgroundColor());
+    }
+
+    public boolean isOpaque() {
+        return true;
+    }
+
+    public Color getGradientColorA() {
+        return gradientColorA;
+    }
+
+    public void setGradientColorA(Color c) {
+        if(c != null) {
+            gradientColorA = c;
+        }
+    }
+
+    public Color getGradientColorB() {
+        return gradientColorB;
+    }
+
+    public void setGradientColorB(Color c) {
+        if(c != null) {
+            gradientColorB = c;
+        }
+    }
+
+    public Color getOuterColor() {
+        return outerColor;
+    }
+
+    public void setOuterColor(Color c) {
+        if(c != null) {
+            outerColor = c;
+        }
+    }
+
+    public Color getBackgroundColor() {
+        return backgroundColor;
+    }
+
+    public void setBackgroundColor(Color c) {
+        if(c != null) {
+            backgroundColor = c;
+            setBackground(c);
+            bgChanged = true;
+        }
+    }
+
+    public void start() {
+        Dimension size = getSize();
+        for (int i = 0; i < animpts.length; i += 2) {
+            animpts[i + 0] = (float) (Math.random() * size.width);
+            animpts[i + 1] = (float) (Math.random() * size.height);
+            deltas[i + 0] = (float) (Math.random() * 4.0 + 2.0);
+            deltas[i + 1] = (float) (Math.random() * 4.0 + 2.0);
+            if (animpts[i + 0] > size.width / 6.0f) {
+                deltas[i + 0] = -deltas[i + 0];
+            }
+            if (animpts[i + 1] > size.height / 6.0f) {
+                deltas[i + 1] = -deltas[i + 1];
+            }
+        }
+        anim = new Thread(this);
+        anim.setPriority(Thread.MIN_PRIORITY);
+        anim.start();
+    }
+
+    public synchronized void stop() {
+        anim = null;
+        notify();
+    }
+
+    public void animate(float[] pts, float[] deltas, int index, int limit) {
+        float newpt = pts[index] + deltas[index];
+        if (newpt <= 0) {
+            newpt = -newpt;
+            deltas[index] = (float) (Math.random() * 3.0 + 2.0);
+        } else if (newpt >= (float) limit) {
+            newpt = 2.0f * limit - newpt;
+            deltas[index] = - (float) (Math.random() * 3.0 + 2.0);
+        }
+        pts[index] = newpt;
+    }
+
+    public void run() {
+        Thread me = Thread.currentThread();
+        while (getSize().width <= 0) {
+            try {
+                anim.sleep(500);
+            } catch (InterruptedException e) {
+                return;
+            }
+        }
+
+        Graphics2D g2d = null;
+        Graphics2D BufferG2D = null;
+        Graphics2D ScreenG2D = null;
+        BasicStroke solid = new BasicStroke(9.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 9.0f);
+        GeneralPath gp = new GeneralPath(GeneralPath.WIND_NON_ZERO);
+        int rule = AlphaComposite.SRC_OVER;
+        AlphaComposite opaque = AlphaComposite.SrcOver;
+        AlphaComposite blend = AlphaComposite.getInstance(rule, 0.9f);
+        AlphaComposite set = AlphaComposite.Src;
+        int frame = 0;
+        int frametmp = 0;
+        Dimension oldSize = getSize();
+        Shape clippath = null;
+        while (anim == me) {
+            Dimension size = getSize();
+            if (size.width != oldSize.width || size.height != oldSize.height) {
+                img = null;
+                clippath = null;
+                if (BufferG2D != null) {
+                    BufferG2D.dispose();
+                    BufferG2D = null;
+                }
+                if (ScreenG2D != null) {
+                    ScreenG2D.dispose();
+                    ScreenG2D = null;
+                }
+            }
+            oldSize = size;
+
+            if (img == null) {
+                img = (BufferedImage) createImage(size.width, size.height);
+            }
+
+        if (BufferG2D == null) {
+                BufferG2D = img.createGraphics();
+                BufferG2D.setRenderingHint(RenderingHints.KEY_RENDERING,
+                                           RenderingHints.VALUE_RENDER_DEFAULT);
+                BufferG2D.setClip(clippath);
+            }
+            g2d = BufferG2D;
+
+            float[] ctrlpts;
+            for (int i = 0; i < animpts.length; i += 2) {
+                animate(animpts, deltas, i + 0, size.width);
+                animate(animpts, deltas, i + 1, size.height);
+            }
+            ctrlpts = animpts;
+            int len = ctrlpts.length;
+            gp.reset();
+            int dir = 0;
+            float prevx = ctrlpts[len - 2];
+            float prevy = ctrlpts[len - 1];
+            float curx = ctrlpts[0];
+            float cury = ctrlpts[1];
+            float midx = (curx + prevx) / 2.0f;
+            float midy = (cury + prevy) / 2.0f;
+            gp.moveTo(midx, midy);
+            for (int i = 2; i <= ctrlpts.length; i += 2) {
+                float x1 = (midx + curx) / 2.0f;
+                float y1 = (midy + cury) / 2.0f;
+                prevx = curx;
+                prevy = cury;
+                if (i < ctrlpts.length) {
+                    curx = ctrlpts[i + 0];
+                    cury = ctrlpts[i + 1];
+                } else {
+                    curx = ctrlpts[0];
+                    cury = ctrlpts[1];
+                }
+                midx = (curx + prevx) / 2.0f;
+                midy = (cury + prevy) / 2.0f;
+                float x2 = (prevx + midx) / 2.0f;
+                float y2 = (prevy + midy) / 2.0f;
+                gp.curveTo(x1, y1, x2, y2, midx, midy);
+            }
+            gp.closePath();
+
+            synchronized(lock) {
+        g2d.setComposite(set);
+            g2d.setBackground(backgroundColor);
+            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                 RenderingHints.VALUE_ANTIALIAS_OFF);
+
+            if(bgChanged || bounds == null) {
+                bounds = new Rectangle(0, 0, getWidth(), getHeight());
+                bgChanged = false;
+            }
+
+        // g2d.clearRect(bounds.x-5, bounds.y-5, bounds.x + bounds.width + 5, bounds.y + bounds.height + 5);
+            g2d.clearRect(0, 0, getWidth(), getHeight());
+
+            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                 RenderingHints.VALUE_ANTIALIAS_ON);
+            g2d.setColor(outerColor);
+            g2d.setComposite(opaque);
+            g2d.setStroke(solid);
+            g2d.draw(gp);
+            g2d.setPaint(gradient);
+
+            if(!bgChanged) {
+                bounds = gp.getBounds();
+            } else {
+                bounds = new Rectangle(0, 0, getWidth(), getHeight());
+                bgChanged = false;
+            }
+            gradient = new GradientPaint(bounds.x, bounds.y, gradientColorA,
+                                         bounds.x + bounds.width, bounds.y + bounds.height,
+                                         gradientColorB, true);
+            g2d.setComposite(blend);
+            g2d.fill(gp);
+        }
+            if (g2d == BufferG2D) {
+                repaint();
+            }
+            ++frame;
+            Thread.yield();
+        }
+        if (g2d != null) {
+            g2d.dispose();
+        }
+    }
+
+    public void paint(Graphics g) {
+        synchronized (lock) {
+           Graphics2D g2d = (Graphics2D) g;
+           if (img != null) {
+               g2d.setComposite(AlphaComposite.Src);
+               g2d.drawImage(img, null, 0, 0);
+           }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ButtonDemo.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,555 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JButton, JRadioButton, JToggleButton, JCheckBox Demos
+ *
+ * @author Jeff Dinkins
+ */
+public class ButtonDemo extends DemoModule implements ChangeListener {
+
+    JTabbedPane tab;
+
+    JPanel buttonPanel = new JPanel();
+    JPanel checkboxPanel = new JPanel();
+    JPanel radioButtonPanel = new JPanel();
+    JPanel toggleButtonPanel = new JPanel();
+
+    Vector buttons = new Vector();
+    Vector checkboxes = new Vector();
+    Vector radiobuttons = new Vector();
+    Vector togglebuttons = new Vector();
+
+    Vector currentControls = buttons;
+
+    JButton button;
+    JCheckBox check;
+    JRadioButton radio;
+    JToggleButton toggle;
+
+    EmptyBorder border5 = new EmptyBorder(5,5,5,5);
+    EmptyBorder border10 = new EmptyBorder(10,10,10,10);
+
+    ItemListener buttonDisplayListener = null;
+    ItemListener buttonPadListener = null;
+
+    Insets insets0 = new Insets(0,0,0,0);
+    Insets insets10 = new Insets(10,10,10,10);
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ButtonDemo demo = new ButtonDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ButtonDemo Constructor
+     */
+    public ButtonDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ButtonDemo", "toolbar/JButton.gif");
+
+        tab = new JTabbedPane();
+        tab.getModel().addChangeListener(this);
+
+        JPanel demo = getDemoPanel();
+        demo.setLayout(new BoxLayout(demo, BoxLayout.Y_AXIS));
+        demo.add(tab);
+
+        addButtons();
+        addRadioButtons();
+        addCheckBoxes();
+        // addToggleButtons();
+        currentControls = buttons;
+    }
+
+    public void addButtons() {
+        tab.addTab(getString("ButtonDemo.buttons"), buttonPanel);
+        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
+        buttonPanel.setBorder(border5);
+
+        JPanel p1 = createVerticalPanel(true);
+        p1.setAlignmentY(TOP_ALIGNMENT);
+        buttonPanel.add(p1);
+
+        // Text Buttons
+        JPanel p2 = createHorizontalPanel(false);
+        p1.add(p2);
+        p2.setBorder(new CompoundBorder(new TitledBorder(null, getString("ButtonDemo.textbuttons"),
+                                                          TitledBorder.LEFT, TitledBorder.TOP), border5));
+
+        buttons.add(p2.add(new JButton(getString("ButtonDemo.button1"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        buttons.add(p2.add(new JButton(getString("ButtonDemo.button2"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        buttons.add(p2.add(new JButton(getString("ButtonDemo.button3"))));
+
+
+        // Image Buttons
+        p1.add(Box.createRigidArea(VGAP30));
+        JPanel p3 = createHorizontalPanel(false);
+        p1.add(p3);
+        p3.setLayout(new BoxLayout(p3, BoxLayout.X_AXIS));
+        p3.setBorder(new TitledBorder(null, getString("ButtonDemo.imagebuttons"),
+                                         TitledBorder.LEFT, TitledBorder.TOP));
+
+        // home image button
+        String description = getString("ButtonDemo.phone");
+        button = new JButton(createImageIcon("buttons/b1.gif", description));
+        button.setPressedIcon(createImageIcon("buttons/b1p.gif", description));
+        button.setRolloverIcon(createImageIcon("buttons/b1r.gif", description));
+        button.setDisabledIcon(createImageIcon("buttons/b1d.gif", description));
+        button.setMargin(new Insets(0,0,0,0));
+        p3.add(button);
+        buttons.add(button);
+        p3.add(Box.createRigidArea(HGAP10));
+
+        // write image button
+        description = getString("ButtonDemo.write");
+        button = new JButton(createImageIcon("buttons/b2.gif", description));
+        button.setPressedIcon(createImageIcon("buttons/b2p.gif", description));
+        button.setRolloverIcon(createImageIcon("buttons/b2r.gif", description));
+        button.setDisabledIcon(createImageIcon("buttons/b2d.gif", description));
+        button.setMargin(new Insets(0,0,0,0));
+        p3.add(button);
+        buttons.add(button);
+        p3.add(Box.createRigidArea(HGAP10));
+
+        // write image button
+        description = getString("ButtonDemo.peace");
+        button = new JButton(createImageIcon("buttons/b3.gif", description));
+        button.setPressedIcon(createImageIcon("buttons/b3p.gif", description));
+        button.setRolloverIcon(createImageIcon("buttons/b3r.gif", description));
+        button.setDisabledIcon(createImageIcon("buttons/b3d.gif", description));
+        button.setMargin(new Insets(0,0,0,0));
+        p3.add(button);
+        buttons.add(button);
+
+        p1.add(Box.createVerticalGlue());
+
+        buttonPanel.add(Box.createHorizontalGlue());
+        currentControls = buttons;
+        buttonPanel.add(createControls());
+    }
+
+    public void addRadioButtons() {
+        ButtonGroup group = new ButtonGroup();
+
+        tab.addTab(getString("ButtonDemo.radiobuttons"), radioButtonPanel);
+        radioButtonPanel.setLayout(new BoxLayout(radioButtonPanel, BoxLayout.X_AXIS));
+        radioButtonPanel.setBorder(border5);
+
+        JPanel p1 = createVerticalPanel(true);
+        p1.setAlignmentY(TOP_ALIGNMENT);
+        radioButtonPanel.add(p1);
+
+        // Text Radio Buttons
+        JPanel p2 = createHorizontalPanel(false);
+        p1.add(p2);
+        p2.setBorder(new CompoundBorder(
+                      new TitledBorder(
+                        null, getString("ButtonDemo.textradiobuttons"),
+                        TitledBorder.LEFT, TitledBorder.TOP), border5)
+        );
+
+        radio = (JRadioButton)p2.add(
+                new JRadioButton(getString("ButtonDemo.radio1")));
+        group.add(radio);
+        radiobuttons.add(radio);
+        p2.add(Box.createRigidArea(HGAP10));
+
+        radio = (JRadioButton)p2.add(
+                new JRadioButton(getString("ButtonDemo.radio2")));
+        group.add(radio);
+        radiobuttons.add(radio);
+        p2.add(Box.createRigidArea(HGAP10));
+
+        radio = (JRadioButton)p2.add(
+                new JRadioButton(getString("ButtonDemo.radio3")));
+        group.add(radio);
+        radiobuttons.add(radio);
+
+        // Image Radio Buttons
+        group = new ButtonGroup();
+        p1.add(Box.createRigidArea(VGAP30));
+        JPanel p3 = createHorizontalPanel(false);
+        p1.add(p3);
+        p3.setLayout(new BoxLayout(p3, BoxLayout.X_AXIS));
+        p3.setBorder(new TitledBorder(null, getString("ButtonDemo.imageradiobuttons"),
+                                         TitledBorder.LEFT, TitledBorder.TOP));
+
+        // image radio button 1
+        String description = getString("ButtonDemo.customradio");
+        String text = getString("ButtonDemo.radio1");
+        radio = new JRadioButton(text, createImageIcon("buttons/rb.gif", description));
+        radio.setPressedIcon(createImageIcon("buttons/rbp.gif", description));
+        radio.setRolloverIcon(createImageIcon("buttons/rbr.gif", description));
+        radio.setRolloverSelectedIcon(createImageIcon("buttons/rbrs.gif", description));
+        radio.setSelectedIcon(createImageIcon("buttons/rbs.gif", description));
+        radio.setMargin(new Insets(0,0,0,0));
+        group.add(radio);
+        p3.add(radio);
+        radiobuttons.add(radio);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image radio button 2
+        text = getString("ButtonDemo.radio2");
+        radio = new JRadioButton(text, createImageIcon("buttons/rb.gif", description));
+        radio.setPressedIcon(createImageIcon("buttons/rbp.gif", description));
+        radio.setRolloverIcon(createImageIcon("buttons/rbr.gif", description));
+        radio.setRolloverSelectedIcon(createImageIcon("buttons/rbrs.gif", description));
+        radio.setSelectedIcon(createImageIcon("buttons/rbs.gif", description));
+        radio.setMargin(new Insets(0,0,0,0));
+        group.add(radio);
+        p3.add(radio);
+        radiobuttons.add(radio);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image radio button 3
+        text = getString("ButtonDemo.radio3");
+        radio = new JRadioButton(text, createImageIcon("buttons/rb.gif", description));
+        radio.setPressedIcon(createImageIcon("buttons/rbp.gif", description));
+        radio.setRolloverIcon(createImageIcon("buttons/rbr.gif", description));
+        radio.setRolloverSelectedIcon(createImageIcon("buttons/rbrs.gif", description));
+        radio.setSelectedIcon(createImageIcon("buttons/rbs.gif", description));
+        radio.setMargin(new Insets(0,0,0,0));
+        group.add(radio);
+        radiobuttons.add(radio);
+        p3.add(radio);
+
+        // verticaly glue fills out the rest of the box
+        p1.add(Box.createVerticalGlue());
+
+        radioButtonPanel.add(Box.createHorizontalGlue());
+        currentControls = radiobuttons;
+        radioButtonPanel.add(createControls());
+    }
+
+
+    public void addCheckBoxes() {
+        tab.addTab(getString("ButtonDemo.checkboxes"), checkboxPanel);
+        checkboxPanel.setLayout(new BoxLayout(checkboxPanel, BoxLayout.X_AXIS));
+        checkboxPanel.setBorder(border5);
+
+        JPanel p1 = createVerticalPanel(true);
+        p1.setAlignmentY(TOP_ALIGNMENT);
+        checkboxPanel.add(p1);
+
+        // Text Radio Buttons
+        JPanel p2 = createHorizontalPanel(false);
+        p1.add(p2);
+        p2.setBorder(new CompoundBorder(
+                      new TitledBorder(
+                        null, getString("ButtonDemo.textcheckboxes"),
+                        TitledBorder.LEFT, TitledBorder.TOP), border5)
+        );
+
+        checkboxes.add(p2.add(new JCheckBox(getString("ButtonDemo.check1"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        checkboxes.add(p2.add(new JCheckBox(getString("ButtonDemo.check2"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        checkboxes.add(p2.add(new JCheckBox(getString("ButtonDemo.check3"))));
+
+        // Image Radio Buttons
+        p1.add(Box.createRigidArea(VGAP30));
+        JPanel p3 = createHorizontalPanel(false);
+        p1.add(p3);
+        p3.setLayout(new BoxLayout(p3, BoxLayout.X_AXIS));
+        p3.setBorder(new TitledBorder(null, getString("ButtonDemo.imagecheckboxes"),
+                                         TitledBorder.LEFT, TitledBorder.TOP));
+
+        // image checkbox 1
+        String description = getString("ButtonDemo.customcheck");
+        String text = getString("ButtonDemo.check1");
+        check = new JCheckBox(text, createImageIcon("buttons/cb.gif", description));
+        check.setRolloverIcon(createImageIcon("buttons/cbr.gif", description));
+        check.setRolloverSelectedIcon(createImageIcon("buttons/cbrs.gif", description));
+        check.setSelectedIcon(createImageIcon("buttons/cbs.gif", description));
+        check.setMargin(new Insets(0,0,0,0));
+        p3.add(check);
+        checkboxes.add(check);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image checkbox 2
+        text = getString("ButtonDemo.check2");
+        check = new JCheckBox(text, createImageIcon("buttons/cb.gif", description));
+        check.setRolloverIcon(createImageIcon("buttons/cbr.gif", description));
+        check.setRolloverSelectedIcon(createImageIcon("buttons/cbrs.gif", description));
+        check.setSelectedIcon(createImageIcon("buttons/cbs.gif", description));
+        check.setMargin(new Insets(0,0,0,0));
+        p3.add(check);
+        checkboxes.add(check);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image checkbox 3
+        text = getString("ButtonDemo.check3");
+        check = new JCheckBox(text, createImageIcon("buttons/cb.gif", description));
+        check.setRolloverIcon(createImageIcon("buttons/cbr.gif", description));
+        check.setRolloverSelectedIcon(createImageIcon("buttons/cbrs.gif", description));
+        check.setSelectedIcon(createImageIcon("buttons/cbs.gif", description));
+        check.setMargin(new Insets(0,0,0,0));
+        p3.add(check);
+        checkboxes.add(check);
+
+        // verticaly glue fills out the rest of the box
+        p1.add(Box.createVerticalGlue());
+
+        checkboxPanel.add(Box.createHorizontalGlue());
+        currentControls = checkboxes;
+        checkboxPanel.add(createControls());
+    }
+
+    public void addToggleButtons() {
+        tab.addTab(getString("ButtonDemo.togglebuttons"), toggleButtonPanel);
+    }
+
+    public JPanel createControls() {
+        JPanel controls = new JPanel() {
+            public Dimension getMaximumSize() {
+                return new Dimension(300, super.getMaximumSize().height);
+            }
+        };
+        controls.setLayout(new BoxLayout(controls, BoxLayout.Y_AXIS));
+        controls.setAlignmentY(TOP_ALIGNMENT);
+        controls.setAlignmentX(LEFT_ALIGNMENT);
+
+        JPanel buttonControls = createHorizontalPanel(true);
+        buttonControls.setAlignmentY(TOP_ALIGNMENT);
+        buttonControls.setAlignmentX(LEFT_ALIGNMENT);
+
+        JPanel leftColumn = createVerticalPanel(false);
+        leftColumn.setAlignmentX(LEFT_ALIGNMENT);
+        leftColumn.setAlignmentY(TOP_ALIGNMENT);
+
+        JPanel rightColumn = new LayoutControlPanel(this);
+
+        buttonControls.add(leftColumn);
+        buttonControls.add(Box.createRigidArea(HGAP20));
+        buttonControls.add(rightColumn);
+        buttonControls.add(Box.createRigidArea(HGAP20));
+
+        controls.add(buttonControls);
+
+        createListeners();
+
+        // Display Options
+        JLabel l = new JLabel(getString("ButtonDemo.controlpanel_label"));
+        leftColumn.add(l);
+
+        JCheckBox bordered = new JCheckBox(getString("ButtonDemo.paintborder"));
+        bordered.setActionCommand("PaintBorder");
+        bordered.setToolTipText(getString("ButtonDemo.paintborder_tooltip"));
+        bordered.setMnemonic(getMnemonic("ButtonDemo.paintborder_mnemonic"));
+        if (currentControls == buttons) {
+                bordered.setSelected(true);
+        }
+        bordered.addItemListener(buttonDisplayListener);
+        leftColumn.add(bordered);
+
+        JCheckBox focused = new JCheckBox(getString("ButtonDemo.paintfocus"));
+        focused.setActionCommand("PaintFocus");
+        focused.setToolTipText(getString("ButtonDemo.paintfocus_tooltip"));
+        focused.setMnemonic(getMnemonic("ButtonDemo.paintfocus_mnemonic"));
+        focused.setSelected(true);
+        focused.addItemListener(buttonDisplayListener);
+        leftColumn.add(focused);
+
+        JCheckBox enabled = new JCheckBox(getString("ButtonDemo.enabled"));
+        enabled.setActionCommand("Enabled");
+        enabled.setToolTipText(getString("ButtonDemo.enabled_tooltip"));
+        enabled.setSelected(true);
+        enabled.addItemListener(buttonDisplayListener);
+        enabled.setMnemonic(getMnemonic("ButtonDemo.enabled_mnemonic"));
+        leftColumn.add(enabled);
+
+        JCheckBox filled = new JCheckBox(getString("ButtonDemo.contentfilled"));
+        filled.setActionCommand("ContentFilled");
+        filled.setToolTipText(getString("ButtonDemo.contentfilled_tooltip"));
+        filled.setSelected(true);
+        filled.addItemListener(buttonDisplayListener);
+        filled.setMnemonic(getMnemonic("ButtonDemo.contentfilled_mnemonic"));
+        leftColumn.add(filled);
+
+        leftColumn.add(Box.createRigidArea(VGAP20));
+
+        l = new JLabel(getString("ButtonDemo.padamount_label"));
+        leftColumn.add(l);
+        ButtonGroup group = new ButtonGroup();
+        JRadioButton defaultPad = new JRadioButton(getString("ButtonDemo.default"));
+        defaultPad.setToolTipText(getString("ButtonDemo.default_tooltip"));
+        defaultPad.setMnemonic(getMnemonic("ButtonDemo.default_mnemonic"));
+        defaultPad.addItemListener(buttonPadListener);
+        group.add(defaultPad);
+        defaultPad.setSelected(true);
+        leftColumn.add(defaultPad);
+
+        JRadioButton zeroPad = new JRadioButton(getString("ButtonDemo.zero"));
+        zeroPad.setActionCommand("ZeroPad");
+        zeroPad.setToolTipText(getString("ButtonDemo.zero_tooltip"));
+        zeroPad.addItemListener(buttonPadListener);
+        zeroPad.setMnemonic(getMnemonic("ButtonDemo.zero_mnemonic"));
+        group.add(zeroPad);
+        leftColumn.add(zeroPad);
+
+        JRadioButton tenPad = new JRadioButton(getString("ButtonDemo.ten"));
+        tenPad.setActionCommand("TenPad");
+        tenPad.setMnemonic(getMnemonic("ButtonDemo.ten_mnemonic"));
+        tenPad.setToolTipText(getString("ButtonDemo.ten_tooltip"));
+        tenPad.addItemListener(buttonPadListener);
+        group.add(tenPad);
+        leftColumn.add(tenPad);
+
+        leftColumn.add(Box.createRigidArea(VGAP20));
+        return controls;
+    }
+
+    public void createListeners() {
+        buttonDisplayListener = new ItemListener() {
+                Component c;
+                AbstractButton b;
+
+                public void itemStateChanged(ItemEvent e) {
+                    JCheckBox cb = (JCheckBox) e.getSource();
+                    String command = cb.getActionCommand();
+                    if(command == "Enabled") {
+                        for(int i = 0; i < currentControls.size(); i++) {
+                            c = (Component) currentControls.elementAt(i);
+                            c.setEnabled(cb.isSelected());
+                            c.invalidate();
+                        }
+                    } else if(command == "PaintBorder") {
+                        c = (Component) currentControls.elementAt(0);
+                        if(c instanceof AbstractButton) {
+                            for(int i = 0; i < currentControls.size(); i++) {
+                                b = (AbstractButton) currentControls.elementAt(i);
+                                b.setBorderPainted(cb.isSelected());
+                                b.invalidate();
+                            }
+                        }
+                    } else if(command == "PaintFocus") {
+                        c = (Component) currentControls.elementAt(0);
+                        if(c instanceof AbstractButton) {
+                            for(int i = 0; i < currentControls.size(); i++) {
+                                b = (AbstractButton) currentControls.elementAt(i);
+                                b.setFocusPainted(cb.isSelected());
+                                b.invalidate();
+                            }
+                        }
+                    } else if(command == "ContentFilled") {
+                        c = (Component) currentControls.elementAt(0);
+                        if(c instanceof AbstractButton) {
+                            for(int i = 0; i < currentControls.size(); i++) {
+                                b = (AbstractButton) currentControls.elementAt(i);
+                                b.setContentAreaFilled(cb.isSelected());
+                                b.invalidate();
+                            }
+                        }
+                    }
+                    invalidate();
+                    validate();
+                    repaint();
+                }
+        };
+
+        buttonPadListener = new ItemListener() {
+                Component c;
+                AbstractButton b;
+
+                public void itemStateChanged(ItemEvent e) {
+                    // *** pad = 0
+                    int pad = -1;
+                    JRadioButton rb = (JRadioButton) e.getSource();
+                    String command = rb.getActionCommand();
+                    if(command == "ZeroPad" && rb.isSelected()) {
+                        pad = 0;
+                    } else if(command == "TenPad" && rb.isSelected()) {
+                        pad = 10;
+                    }
+
+                    for(int i = 0; i < currentControls.size(); i++) {
+                        b = (AbstractButton) currentControls.elementAt(i);
+                        if(pad == -1) {
+                            b.setMargin(null);
+                        } else if(pad == 0) {
+                            b.setMargin(insets0);
+                        } else {
+                            b.setMargin(insets10);
+                        }
+                    }
+                    invalidate();
+                    validate();
+                    repaint();
+                }
+        };
+    }
+
+    public void stateChanged(ChangeEvent e) {
+        SingleSelectionModel model = (SingleSelectionModel) e.getSource();
+        if(model.getSelectedIndex() == 0) {
+            currentControls = buttons;
+        } else if(model.getSelectedIndex() == 1) {
+            currentControls = radiobuttons;
+        } else if(model.getSelectedIndex() == 2) {
+            currentControls = checkboxes;
+        } else {
+            currentControls = togglebuttons;
+        }
+    }
+
+    public Vector getCurrentControls() {
+        return currentControls;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/CharcoalTheme.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,71 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a theme using gray colors.
+ *
+ * @author Steve Wilson
+ */
+public class CharcoalTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Charcoal"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(66, 33, 66);
+    private final ColorUIResource primary2 = new ColorUIResource(90, 86, 99);
+    private final ColorUIResource primary3 = new ColorUIResource(99, 99, 99);
+
+    private final ColorUIResource secondary1 = new ColorUIResource(0, 0, 0);
+    private final ColorUIResource secondary2 = new ColorUIResource(51, 51, 51);
+    private final ColorUIResource secondary3 = new ColorUIResource(102, 102, 102);
+
+    private final ColorUIResource black = new ColorUIResource(222, 222, 222);
+    private final ColorUIResource white = new ColorUIResource(0, 0, 0);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+
+    protected ColorUIResource getSecondary1() { return secondary1; }
+    protected ColorUIResource getSecondary2() { return secondary2; }
+    protected ColorUIResource getSecondary3() { return secondary3; }
+
+    protected ColorUIResource getBlack() { return black; }
+    protected ColorUIResource getWhite() { return white; }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ColorChooserDemo.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,209 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JColorChooserDemo
+ *
+ * @author Jeff Dinkins
+ */
+public class ColorChooserDemo extends DemoModule {
+
+    BezierAnimationPanel bezAnim;
+    JButton outerColorButton = null;
+    JButton backgroundColorButton = null;
+    JButton gradientAButton = null;
+    JButton gradientBButton = null;
+
+    // to store the color chosen from the JColorChooser
+    private Color chosen;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ColorChooserDemo demo = new ColorChooserDemo(null);
+        demo.mainImpl();
+    }
+
+
+    /**
+     * ColorChooserDemo Constructor
+     */
+    public ColorChooserDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ColorChooserDemo", "toolbar/JColorChooser.gif");
+
+        // Create the bezier animation panel to put in the center of the panel.
+        bezAnim = new BezierAnimationPanel();
+
+        outerColorButton = new JButton(getString("ColorChooserDemo.outer_line"));
+        outerColorButton.setIcon(new ColorSwatch("OuterLine", bezAnim));
+
+        backgroundColorButton = new JButton(getString("ColorChooserDemo.background"));
+        backgroundColorButton.setIcon(new ColorSwatch("Background", bezAnim));
+
+        gradientAButton = new JButton(getString("ColorChooserDemo.grad_a"));
+        gradientAButton.setIcon(new ColorSwatch("GradientA", bezAnim));
+
+        gradientBButton = new JButton(getString("ColorChooserDemo.grad_b"));
+        gradientBButton.setIcon(new ColorSwatch("GradientB", bezAnim));
+
+        ActionListener l = new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                Color current = bezAnim.getOuterColor();
+
+                if(e.getSource() == backgroundColorButton) {
+                    current = bezAnim.getBackgroundColor();
+                } else if(e.getSource() == gradientAButton) {
+                    current = bezAnim.getGradientColorA();
+                } else if(e.getSource() == gradientBButton) {
+                    current = bezAnim.getGradientColorB();
+                }
+
+                final JColorChooser chooser = new JColorChooser(current != null ?
+                                                                current :
+                                                                Color.WHITE);
+                if (getSwingSet2() != null && getSwingSet2().isDragEnabled()) {
+                    chooser.setDragEnabled(true);
+                }
+
+                chosen = null;
+                ActionListener okListener = new ActionListener() {
+                    public void actionPerformed(ActionEvent ae) {
+                        chosen = chooser.getColor();
+                    }
+                };
+
+                JDialog dialog = JColorChooser.createDialog(getDemoPanel(),
+                                                            getString("ColorChooserDemo.chooser_title"),
+                                                            true,
+                                                            chooser,
+                                                            okListener,
+                                                            null);
+
+                dialog.show();
+
+                if(e.getSource() == outerColorButton) {
+                    bezAnim.setOuterColor(chosen);
+                } else if(e.getSource() == backgroundColorButton) {
+                    bezAnim.setBackgroundColor(chosen);
+                } else if(e.getSource() == gradientAButton) {
+                    bezAnim.setGradientColorA(chosen);
+                } else {
+                    bezAnim.setGradientColorB(chosen);
+                }
+            }
+        };
+
+        outerColorButton.addActionListener(l);
+        backgroundColorButton.addActionListener(l);
+        gradientAButton.addActionListener(l);
+        gradientBButton.addActionListener(l);
+
+        // Add everything to the panel
+        JPanel p = getDemoPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+
+        // Add control buttons
+        JPanel buttonPanel = new JPanel();
+        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
+
+        buttonPanel.add(backgroundColorButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(15, 1)));
+
+        buttonPanel.add(gradientAButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(15, 1)));
+
+        buttonPanel.add(gradientBButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(15, 1)));
+
+        buttonPanel.add(outerColorButton);
+
+        // Add the panel midway down the panel
+        p.add(Box.createRigidArea(new Dimension(1, 10)));
+        p.add(buttonPanel);
+        p.add(Box.createRigidArea(new Dimension(1, 5)));
+        p.add(bezAnim);
+    }
+
+    class ColorSwatch implements Icon {
+        String gradient;
+        BezierAnimationPanel bez;
+
+        public ColorSwatch(String g, BezierAnimationPanel b) {
+            bez = b;
+            gradient = g;
+        }
+
+        public int getIconWidth() {
+            return 11;
+        }
+
+        public int getIconHeight() {
+            return 11;
+        }
+
+        public void paintIcon(Component c, Graphics g, int x, int y) {
+            g.setColor(Color.black);
+            g.fillRect(x, y, getIconWidth(), getIconHeight());
+            if(gradient.equals("GradientA")) {
+                g.setColor(bez.getGradientColorA());
+            } else if(gradient.equals("GradientB")) {
+                g.setColor(bez.getGradientColorB());
+            } else if(gradient.equals("Background")) {
+                g.setColor(bez.getBackgroundColor());
+            } else if(gradient.equals("OuterLine")) {
+                g.setColor(bez.getOuterColor());
+            }
+            g.fillRect(x+2, y+2, getIconWidth()-4, getIconHeight()-4);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ComboBoxDemo.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,400 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JComboBox Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class ComboBoxDemo extends DemoModule implements ActionListener {
+
+    Face face;
+    JLabel faceLabel;
+
+    JComboBox hairCB;
+    JComboBox eyesCB;
+    JComboBox mouthCB;
+
+    JComboBox presetCB;
+
+    Hashtable parts = new Hashtable();
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ComboBoxDemo demo = new ComboBoxDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ComboBoxDemo Constructor
+     */
+    public ComboBoxDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ComboBoxDemo", "toolbar/JComboBox.gif");
+
+        createComboBoxDemo();
+    }
+
+    public void createComboBoxDemo() {
+        JPanel demo = getDemoPanel();
+
+        JPanel demoPanel = getDemoPanel();
+        demoPanel.setLayout(new BoxLayout(demoPanel, BoxLayout.Y_AXIS));
+
+        JPanel innerPanel = new JPanel();
+        innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
+
+        demoPanel.add(Box.createRigidArea(VGAP20));
+        demoPanel.add(innerPanel);
+        demoPanel.add(Box.createRigidArea(VGAP20));
+
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // Create a panel to hold buttons
+        JPanel comboBoxPanel = new JPanel() {
+                public Dimension getMaximumSize() {
+                    return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+                }
+        };
+        comboBoxPanel.setLayout(new BoxLayout(comboBoxPanel, BoxLayout.Y_AXIS));
+
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        JLabel l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.presets")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        presetCB = (JComboBox) comboBoxPanel.add(createPresetComboBox());
+        presetCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(presetCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP30));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.hair_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        hairCB = (JComboBox) comboBoxPanel.add(createHairComboBox());
+        hairCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(hairCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.eyes_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        eyesCB = (JComboBox) comboBoxPanel.add(createEyesComboBox());
+        eyesCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(eyesCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.mouth_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        mouthCB = (JComboBox) comboBoxPanel.add(createMouthComboBox());
+        mouthCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(mouthCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        // Fill up the remaining space
+        comboBoxPanel.add(new JPanel(new BorderLayout()));
+
+        // Create and place the Face.
+
+        face = new Face();
+        JPanel facePanel = new JPanel();
+        facePanel.setLayout(new BorderLayout());
+        facePanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
+
+        faceLabel = new JLabel(face);
+        facePanel.add(faceLabel, BorderLayout.CENTER);
+        // Indicate that the face panel is controlled by the hair, eyes and
+        // mouth combo boxes.
+        Object [] controlledByObjects = new Object[3];
+        controlledByObjects[0] = hairCB;
+        controlledByObjects[1] = eyesCB;
+        controlledByObjects[2] = mouthCB;
+        AccessibleRelation controlledByRelation =
+            new AccessibleRelation(AccessibleRelation.CONTROLLED_BY_PROPERTY,
+                                   controlledByObjects);
+        facePanel.getAccessibleContext().getAccessibleRelationSet().add(controlledByRelation);
+
+        // Indicate that the hair, eyes and mouth combo boxes are controllers
+        // for the face panel.
+        AccessibleRelation controllerForRelation =
+            new AccessibleRelation(AccessibleRelation.CONTROLLER_FOR_PROPERTY,
+                                   facePanel);
+        hairCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+        eyesCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+        mouthCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+
+        // add buttons and image panels to inner panel
+        innerPanel.add(comboBoxPanel);
+        innerPanel.add(Box.createRigidArea(HGAP30));
+        innerPanel.add(facePanel);
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // load up the face parts
+        addFace("brent",     getString("ComboBoxDemo.brent"));
+        addFace("georges",   getString("ComboBoxDemo.georges"));
+        addFace("hans",      getString("ComboBoxDemo.hans"));
+        addFace("howard",    getString("ComboBoxDemo.howard"));
+        addFace("james",     getString("ComboBoxDemo.james"));
+        addFace("jeff",      getString("ComboBoxDemo.jeff"));
+        addFace("jon",       getString("ComboBoxDemo.jon"));
+        addFace("lara",      getString("ComboBoxDemo.lara"));
+        addFace("larry",     getString("ComboBoxDemo.larry"));
+        addFace("lisa",      getString("ComboBoxDemo.lisa"));
+        addFace("michael",   getString("ComboBoxDemo.michael"));
+        addFace("philip",    getString("ComboBoxDemo.philip"));
+        addFace("scott",     getString("ComboBoxDemo.scott"));
+
+        // set the default face
+        presetCB.setSelectedIndex(0);
+    }
+
+    void addFace(String name, String i18n_name) {
+        ImageIcon i;
+        String i18n_hair = getString("ComboBoxDemo.hair");
+        String i18n_eyes = getString("ComboBoxDemo.eyes");
+        String i18n_mouth = getString("ComboBoxDemo.mouth");
+
+        parts.put(i18n_name, name); // i18n name lookup
+        parts.put(name, i18n_name); // reverse name lookup
+
+        i = createImageIcon("combobox/" + name + "hair.jpg", i18n_name + i18n_hair);
+        parts.put(name +  "hair", i);
+
+        i = createImageIcon("combobox/" + name + "eyes.jpg", i18n_name + i18n_eyes);
+        parts.put(name +  "eyes", i);
+
+        i = createImageIcon("combobox/" + name + "mouth.jpg", i18n_name + i18n_mouth);
+        parts.put(name +  "mouth", i);
+    }
+
+    Face getFace() {
+        return face;
+    }
+
+    JComboBox createHairComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createEyesComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createNoseComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createMouthComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createPresetComboBox() {
+        JComboBox cb = new JComboBox();
+        cb.addItem(getString("ComboBoxDemo.preset1"));
+        cb.addItem(getString("ComboBoxDemo.preset2"));
+        cb.addItem(getString("ComboBoxDemo.preset3"));
+        cb.addItem(getString("ComboBoxDemo.preset4"));
+        cb.addItem(getString("ComboBoxDemo.preset5"));
+        cb.addItem(getString("ComboBoxDemo.preset6"));
+        cb.addItem(getString("ComboBoxDemo.preset7"));
+        cb.addItem(getString("ComboBoxDemo.preset8"));
+        cb.addItem(getString("ComboBoxDemo.preset9"));
+        cb.addItem(getString("ComboBoxDemo.preset10"));
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    void fillComboBox(JComboBox cb) {
+        cb.addItem(getString("ComboBoxDemo.brent"));
+        cb.addItem(getString("ComboBoxDemo.georges"));
+        cb.addItem(getString("ComboBoxDemo.hans"));
+        cb.addItem(getString("ComboBoxDemo.howard"));
+        cb.addItem(getString("ComboBoxDemo.james"));
+        cb.addItem(getString("ComboBoxDemo.jeff"));
+        cb.addItem(getString("ComboBoxDemo.jon"));
+        cb.addItem(getString("ComboBoxDemo.lara"));
+        cb.addItem(getString("ComboBoxDemo.larry"));
+        cb.addItem(getString("ComboBoxDemo.lisa"));
+        cb.addItem(getString("ComboBoxDemo.michael"));
+        cb.addItem(getString("ComboBoxDemo.philip"));
+        cb.addItem(getString("ComboBoxDemo.scott"));
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if(e.getSource() == hairCB) {
+            String name = (String) parts.get((String) hairCB.getSelectedItem());
+            face.setHair((ImageIcon) parts.get(name + "hair"));
+            faceLabel.repaint();
+        } else if(e.getSource() == eyesCB) {
+            String name = (String) parts.get((String) eyesCB.getSelectedItem());
+            face.setEyes((ImageIcon) parts.get(name + "eyes"));
+            faceLabel.repaint();
+        } else if(e.getSource() == mouthCB) {
+            String name = (String) parts.get((String) mouthCB.getSelectedItem());
+            face.setMouth((ImageIcon) parts.get(name + "mouth"));
+            faceLabel.repaint();
+        } else if(e.getSource() == presetCB) {
+            String hair = null;
+            String eyes = null;
+            String mouth = null;
+            switch(presetCB.getSelectedIndex()) {
+               case 0:
+                   hair = (String) parts.get("philip");
+                   eyes = (String) parts.get("howard");
+                   mouth = (String) parts.get("jeff");
+                   break;
+               case 1:
+                   hair = (String) parts.get("jeff");
+                   eyes = (String) parts.get("larry");
+                   mouth = (String) parts.get("philip");
+                   break;
+               case 2:
+                   hair = (String) parts.get("howard");
+                   eyes = (String) parts.get("scott");
+                   mouth = (String) parts.get("hans");
+                   break;
+               case 3:
+                   hair = (String) parts.get("philip");
+                   eyes = (String) parts.get("jeff");
+                   mouth = (String) parts.get("hans");
+                   break;
+               case 4:
+                   hair = (String) parts.get("brent");
+                   eyes = (String) parts.get("jon");
+                   mouth = (String) parts.get("scott");
+                   break;
+               case 5:
+                   hair = (String) parts.get("lara");
+                   eyes = (String) parts.get("larry");
+                   mouth = (String) parts.get("lisa");
+                   break;
+               case 6:
+                   hair = (String) parts.get("james");
+                   eyes = (String) parts.get("philip");
+                   mouth = (String) parts.get("michael");
+                   break;
+               case 7:
+                   hair = (String) parts.get("philip");
+                   eyes = (String) parts.get("lisa");
+                   mouth = (String) parts.get("brent");
+                   break;
+               case 8:
+                   hair = (String) parts.get("james");
+                   eyes = (String) parts.get("philip");
+                   mouth = (String) parts.get("jon");
+                   break;
+               case 9:
+                   hair = (String) parts.get("lara");
+                   eyes = (String) parts.get("jon");
+                   mouth = (String) parts.get("scott");
+                   break;
+            }
+            if(hair != null) {
+                hairCB.setSelectedItem(hair);
+                eyesCB.setSelectedItem(eyes);
+                mouthCB.setSelectedItem(mouth);
+                faceLabel.repaint();
+            }
+        }
+    }
+
+    class Face implements Icon {
+        ImageIcon hair;
+        ImageIcon eyes;
+        ImageIcon mouth;
+
+        void setHair(ImageIcon i) {
+            hair = i;
+        }
+
+        void setEyes(ImageIcon i) {
+            eyes = i;
+        }
+
+        void setMouth(ImageIcon i) {
+            mouth = i;
+        }
+
+        public void paintIcon(Component c, Graphics g, int x, int y) {
+            int height = y;
+            x = c.getWidth()/2 - getIconWidth()/2;
+
+            if(hair != null) {
+                hair.paintIcon(c, g, x, height);   height += hair.getIconHeight();
+            }
+
+            if(eyes != null) {
+                eyes.paintIcon(c, g, x, height);   height += eyes.getIconHeight();
+            }
+
+            if(mouth != null) {
+                mouth.paintIcon(c, g, x, height);
+            }
+        }
+
+        public int getIconWidth() {
+            return 344;
+        }
+
+        public int getIconHeight() {
+            return 455;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ContrastTheme.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.basic.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a higher-contrast Metal Theme.
+ *
+ * @author Michael C. Albers
+ */
+
+public class ContrastTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Contrast"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(0, 0, 0);
+    private final ColorUIResource primary2 = new ColorUIResource(204, 204, 204);
+    private final ColorUIResource primary3 = new ColorUIResource(255, 255, 255);
+    private final ColorUIResource primaryHighlight = new ColorUIResource(102,102,102);
+
+    private final ColorUIResource secondary2 = new ColorUIResource(204, 204, 204);
+    private final ColorUIResource secondary3 = new ColorUIResource(255, 255, 255);
+    private final ColorUIResource controlHighlight = new ColorUIResource(102,102,102);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+    public ColorUIResource getPrimaryControlHighlight() { return primaryHighlight;}
+
+    protected ColorUIResource getSecondary2() { return secondary2; }
+    protected ColorUIResource getSecondary3() { return secondary3; }
+    public ColorUIResource getControlHighlight() { return super.getSecondary3(); }
+
+    public ColorUIResource getFocusColor() { return getBlack(); }
+
+    public ColorUIResource getTextHighlightColor() { return getBlack(); }
+    public ColorUIResource getHighlightedTextColor() { return getWhite(); }
+
+    public ColorUIResource getMenuSelectedBackground() { return getBlack(); }
+    public ColorUIResource getMenuSelectedForeground() { return getWhite(); }
+    public ColorUIResource getAcceleratorForeground() { return getBlack(); }
+    public ColorUIResource getAcceleratorSelectedForeground() { return getWhite(); }
+
+
+    public void addCustomEntriesToTable(UIDefaults table) {
+
+        Border blackLineBorder = new BorderUIResource(new LineBorder( getBlack() ));
+
+        Object textBorder = new BorderUIResource( new CompoundBorder(
+                                                       blackLineBorder,
+                                                       new BasicBorders.MarginBorder()));
+
+        table.put( "ToolTip.border", blackLineBorder);
+        table.put( "TitledBorder.border", blackLineBorder);
+
+        table.put( "TextField.border", textBorder);
+        table.put( "PasswordField.border", textBorder);
+        table.put( "TextArea.border", textBorder);
+        table.put( "TextPane.border", textBorder);
+        table.put( "EditorPane.border", textBorder);
+
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/DemoModule.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,229 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * A generic SwingSet2 demo module
+ *
+ * @author Jeff Dinkins
+ */
+public class DemoModule extends JApplet {
+
+    // The preferred size of the demo
+    private int PREFERRED_WIDTH = 680;
+    private int PREFERRED_HEIGHT = 600;
+
+    Border loweredBorder = new CompoundBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED),
+                                              new EmptyBorder(5,5,5,5));
+
+    // Premade convenience dimensions, for use wherever you need 'em.
+    public static Dimension HGAP2 = new Dimension(2,1);
+    public static Dimension VGAP2 = new Dimension(1,2);
+
+    public static Dimension HGAP5 = new Dimension(5,1);
+    public static Dimension VGAP5 = new Dimension(1,5);
+
+    public static Dimension HGAP10 = new Dimension(10,1);
+    public static Dimension VGAP10 = new Dimension(1,10);
+
+    public static Dimension HGAP15 = new Dimension(15,1);
+    public static Dimension VGAP15 = new Dimension(1,15);
+
+    public static Dimension HGAP20 = new Dimension(20,1);
+    public static Dimension VGAP20 = new Dimension(1,20);
+
+    public static Dimension HGAP25 = new Dimension(25,1);
+    public static Dimension VGAP25 = new Dimension(1,25);
+
+    public static Dimension HGAP30 = new Dimension(30,1);
+    public static Dimension VGAP30 = new Dimension(1,30);
+
+    private SwingSet2 swingset = null;
+    private JPanel panel = null;
+    private String resourceName = null;
+    private String iconPath = null;
+    private String sourceCode = null;
+
+    public DemoModule(SwingSet2 swingset) {
+        this(swingset, null, null);
+    }
+
+    public DemoModule(SwingSet2 swingset, String resourceName, String iconPath) {
+        UIManager.put("swing.boldMetal", Boolean.FALSE);
+        panel = new JPanel();
+        panel.setLayout(new BorderLayout());
+
+        this.resourceName = resourceName;
+        this.iconPath = iconPath;
+        this.swingset = swingset;
+
+        loadSourceCode();
+    }
+
+    public String getResourceName() {
+        return resourceName;
+    }
+
+    public JPanel getDemoPanel() {
+        return panel;
+    }
+
+    public SwingSet2 getSwingSet2() {
+        return swingset;
+    }
+
+
+    public String getString(String key) {
+
+        if (getSwingSet2() != null) {
+            return getSwingSet2().getString(key);
+        }else{
+            return "nada";
+        }
+    }
+
+    public char getMnemonic(String key) {
+        return (getString(key)).charAt(0);
+    }
+
+    public ImageIcon createImageIcon(String filename, String description) {
+        if(getSwingSet2() != null) {
+            return getSwingSet2().createImageIcon(filename, description);
+        } else {
+            String path = "/resources/images/" + filename;
+            return new ImageIcon(getClass().getResource(path), description);
+        }
+    }
+
+
+    public String getSourceCode() {
+        return sourceCode;
+    }
+
+    public void loadSourceCode() {
+        if(getResourceName() != null) {
+            String filename = getResourceName() + ".java";
+            sourceCode = new String("<html><body bgcolor=\"#ffffff\"><pre>");
+            InputStream is;
+            InputStreamReader isr;
+            URL url;
+
+            try {
+                url = getClass().getResource(filename);
+                is = url.openStream();
+                isr = new InputStreamReader(is, "UTF-8");
+                BufferedReader reader = new BufferedReader(isr);
+
+                // Read one line at a time, htmlize using super-spiffy
+                // html java code formating utility from www.CoolServlets.com
+                String line = reader.readLine();
+                while(line != null) {
+                    sourceCode += line + " \n ";
+                    line = reader.readLine();
+                }
+                sourceCode += new String("</pre></body></html>");
+            } catch (Exception ex) {
+                sourceCode = "Could not load file: " + filename;
+            }
+        }
+    }
+
+    public String getName() {
+        return getString(getResourceName() + ".name");
+    };
+
+    public Icon getIcon() {
+        return createImageIcon(iconPath, getResourceName() + ".name");
+    };
+
+    public String getToolTip() {
+        return getString(getResourceName() + ".tooltip");
+    };
+
+    public void mainImpl() {
+        JFrame frame = new JFrame(getName());
+        frame.getContentPane().setLayout(new BorderLayout());
+        frame.getContentPane().add(getDemoPanel(), BorderLayout.CENTER);
+        getDemoPanel().setPreferredSize(new Dimension(PREFERRED_WIDTH, PREFERRED_HEIGHT));
+        frame.pack();
+        frame.show();
+    }
+
+    public JPanel createHorizontalPanel(boolean threeD) {
+        JPanel p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+        p.setAlignmentY(TOP_ALIGNMENT);
+        p.setAlignmentX(LEFT_ALIGNMENT);
+        if(threeD) {
+            p.setBorder(loweredBorder);
+        }
+        return p;
+    }
+
+    public JPanel createVerticalPanel(boolean threeD) {
+        JPanel p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+        p.setAlignmentY(TOP_ALIGNMENT);
+        p.setAlignmentX(LEFT_ALIGNMENT);
+        if(threeD) {
+            p.setBorder(loweredBorder);
+        }
+        return p;
+    }
+
+    public static void main(String[] args) {
+        DemoModule demo = new DemoModule(null);
+        demo.mainImpl();
+    }
+
+    public void init() {
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(getDemoPanel(), BorderLayout.CENTER);
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/DirectionPanel.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,159 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.border.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+
+/**
+ * @author Jeff Dinkins
+ * @author Chester Rose
+ * @author Brian Beck
+ */
+
+public class DirectionPanel extends JPanel {
+
+    private ButtonGroup group;
+
+    public DirectionPanel(boolean enable, String selection, ActionListener l) {
+        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+        setAlignmentY(TOP_ALIGNMENT);
+        setAlignmentX(LEFT_ALIGNMENT);
+
+        Box firstThree = Box.createHorizontalBox();
+        Box secondThree = Box.createHorizontalBox();
+        Box thirdThree = Box.createHorizontalBox();
+
+        if(!enable) {
+            selection = "None";
+        }
+
+        group = new ButtonGroup();
+        DirectionButton b;
+        b = (DirectionButton) firstThree.add(new DirectionButton(  tl_dot, tldn_dot, "NW", "Sets the orientation to the North-West", l, group, selection.equals("NW")));
+        b.setEnabled(enable);
+        b = (DirectionButton) firstThree.add(new DirectionButton(  tm_dot, tmdn_dot, "N",  "Sets the orientation to the North", l, group, selection.equals("N")));
+        b.setEnabled(enable);
+        b = (DirectionButton) firstThree.add(new DirectionButton(  tr_dot, trdn_dot, "NE", "Sets the orientation to the North-East", l, group, selection.equals("NE")));
+        b.setEnabled(enable);
+        b = (DirectionButton) secondThree.add(new DirectionButton( ml_dot, mldn_dot, "W", "Sets the orientation to the West", l, group, selection.equals("W")));
+        b.setEnabled(enable);
+        b = (DirectionButton) secondThree.add(new DirectionButton( c_dot,  cdn_dot,  "C", "Sets the orientation to the Center", l, group, selection.equals("C")));
+        b.setEnabled(enable);
+        b = (DirectionButton) secondThree.add(new DirectionButton( mr_dot, mrdn_dot, "E", "Sets the orientation to the East", l, group, selection.equals("E")));
+        b.setEnabled(enable);
+        b = (DirectionButton) thirdThree.add(new DirectionButton(  bl_dot, bldn_dot, "SW", "Sets the orientation to the South-West", l, group, selection.equals("SW")));
+        b.setEnabled(enable);
+        b = (DirectionButton) thirdThree.add(new DirectionButton(  bm_dot, bmdn_dot, "S", "Sets the orientation to the South", l, group, selection.equals("S")));
+        b.setEnabled(enable);
+        b = (DirectionButton) thirdThree.add(new DirectionButton(  br_dot, brdn_dot, "SE", "Sets the orientation to the South-East", l, group, selection.equals("SE")));
+        b.setEnabled(enable);
+
+        add(firstThree);
+        add(secondThree);
+        add(thirdThree);
+    }
+
+    public String getSelection() {
+        return group.getSelection().getActionCommand();
+    }
+
+    public void setSelection( String selection  ) {
+        Enumeration e = group.getElements();
+        while( e.hasMoreElements() ) {
+            JRadioButton b = (JRadioButton)e.nextElement();
+            if( b.getActionCommand().equals(selection) ) {
+               b.setSelected(true);
+            }
+        }
+    }
+
+    // Chester's way cool layout buttons
+    public ImageIcon bl_dot   = loadImageIcon("bl.gif","bottom left layout button");
+    public ImageIcon bldn_dot = loadImageIcon("bldn.gif","selected bottom left layout button");
+    public ImageIcon bm_dot   = loadImageIcon("bm.gif","bottom middle layout button");
+    public ImageIcon bmdn_dot = loadImageIcon("bmdn.gif","selected bottom middle layout button");
+    public ImageIcon br_dot   = loadImageIcon("br.gif","bottom right layout button");
+    public ImageIcon brdn_dot = loadImageIcon("brdn.gif","selected bottom right layout button");
+    public ImageIcon c_dot    = loadImageIcon("c.gif","center layout button");
+    public ImageIcon cdn_dot  = loadImageIcon("cdn.gif","selected center layout button");
+    public ImageIcon ml_dot   = loadImageIcon("ml.gif","middle left layout button");
+    public ImageIcon mldn_dot = loadImageIcon("mldn.gif","selected middle left layout button");
+    public ImageIcon mr_dot   = loadImageIcon("mr.gif","middle right layout button");
+    public ImageIcon mrdn_dot = loadImageIcon("mrdn.gif","selected middle right layout button");
+    public ImageIcon tl_dot   = loadImageIcon("tl.gif","top left layout button");
+    public ImageIcon tldn_dot = loadImageIcon("tldn.gif","selected top left layout button");
+    public ImageIcon tm_dot   = loadImageIcon("tm.gif","top middle layout button");
+    public ImageIcon tmdn_dot = loadImageIcon("tmdn.gif","selected top middle layout button");
+    public ImageIcon tr_dot   = loadImageIcon("tr.gif","top right layout button");
+    public ImageIcon trdn_dot = loadImageIcon("trdn.gif","selected top right layout button");
+
+    public ImageIcon loadImageIcon(String filename, String description) {
+        String path = "/resources/images/buttons/" + filename;
+        return new ImageIcon(getClass().getResource(path), description);
+    }
+
+
+    public class DirectionButton extends JRadioButton {
+
+        /**
+         * A layout direction button
+         */
+        public DirectionButton(Icon icon, Icon downIcon, String direction,
+                               String description, ActionListener l,
+                               ButtonGroup group, boolean selected)
+        {
+            super();
+            this.addActionListener(l);
+            setFocusPainted(false);
+            setHorizontalTextPosition(CENTER);
+            group.add(this);
+            setIcon(icon);
+            setSelectedIcon(downIcon);
+            setActionCommand(direction);
+            getAccessibleContext().setAccessibleName(direction);
+            getAccessibleContext().setAccessibleDescription(description);
+            setSelected(selected);
+        }
+
+        public boolean isFocusTraversable() {
+            return false;
+        }
+
+        public void setBorder(Border b) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/EmeraldTheme.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a theme using glowing green colors.
+ *
+ * @author Jeff Dinkins
+ */
+public class EmeraldTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Emerald"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(51, 142, 71);
+    private final ColorUIResource primary2 = new ColorUIResource(102, 193, 122);
+    private final ColorUIResource primary3 = new ColorUIResource(153, 244, 173);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ExampleFileView.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,176 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.filechooser.*;
+
+import java.io.File;
+import java.util.Hashtable;
+
+/**
+ * A convenience implementation of the FileView interface that
+ * manages name, icon, traversable, and file type information.
+ *
+ * This this implemention will work well with file systems that use
+ * "dot" extensions to indicate file type. For example: "picture.gif"
+ * as a gif image.
+ *
+ * If the java.io.File ever contains some of this information, such as
+ * file type, icon, and hidden file inforation, this implementation may
+ * become obsolete. At minimum, it should be rewritten at that time to
+ * use any new type information provided by java.io.File
+ *
+ * Example:
+ *    JFileChooser chooser = new JFileChooser();
+ *    fileView = new ExampleFileView();
+ *    fileView.putIcon("jpg", new ImageIcon("images/jpgIcon.jpg"));
+ *    fileView.putIcon("gif", new ImageIcon("images/gifIcon.gif"));
+ *    chooser.setFileView(fileView);
+ *
+ * @author Jeff Dinkins
+ */
+public class ExampleFileView extends FileView {
+    private Hashtable icons = new Hashtable(5);
+    private Hashtable fileDescriptions = new Hashtable(5);
+    private Hashtable typeDescriptions = new Hashtable(5);
+
+    /**
+     * The name of the file.  Do nothing special here. Let
+     * the system file view handle this.
+     * @see FileView#getName
+     */
+    public String getName(File f) {
+        return null;
+    }
+
+    /**
+     * Adds a human readable description of the file.
+     */
+    public void putDescription(File f, String fileDescription) {
+        fileDescriptions.put(f, fileDescription);
+    }
+
+    /**
+     * A human readable description of the file.
+     *
+     * @see FileView#getDescription
+     */
+    public String getDescription(File f) {
+        return (String) fileDescriptions.get(f);
+    };
+
+    /**
+     * Adds a human readable type description for files. Based on "dot"
+     * extension strings, e.g: ".gif". Case is ignored.
+     */
+    public void putTypeDescription(String extension, String typeDescription) {
+        typeDescriptions.put(extension, typeDescription);
+    }
+
+    /**
+     * Adds a human readable type description for files of the type of
+     * the passed in file. Based on "dot" extension strings, e.g: ".gif".
+     * Case is ignored.
+     */
+    public void putTypeDescription(File f, String typeDescription) {
+        putTypeDescription(getExtension(f), typeDescription);
+    }
+
+    /**
+     * A human readable description of the type of the file.
+     *
+     * @see FileView#getTypeDescription
+     */
+    public String getTypeDescription(File f) {
+        return (String) typeDescriptions.get(getExtension(f));
+    }
+
+    /**
+     * Convenience method that returns the "dot" extension for the
+     * given file.
+     */
+    public String getExtension(File f) {
+        String name = f.getName();
+        if(name != null) {
+            int extensionIndex = name.lastIndexOf('.');
+            if(extensionIndex < 0) {
+                return null;
+            }
+            return name.substring(extensionIndex+1).toLowerCase();
+        }
+        return null;
+    }
+
+    /**
+     * Adds an icon based on the file type "dot" extension
+     * string, e.g: ".gif". Case is ignored.
+     */
+    public void putIcon(String extension, Icon icon) {
+        icons.put(extension, icon);
+    }
+
+    /**
+     * Icon that reperesents this file. Default implementation returns
+     * null. You might want to override this to return something more
+     * interesting.
+     *
+     * @see FileView#getIcon
+     */
+    public Icon getIcon(File f) {
+        Icon icon = null;
+        String extension = getExtension(f);
+        if(extension != null) {
+            icon = (Icon) icons.get(extension);
+        }
+        return icon;
+    }
+
+    /**
+     * Whether the directory is traversable or not. Generic implementation
+     * returns true for all directories and special folders.
+     *
+     * You might want to subtype ExampleFileView to do somethimg more interesting,
+     * such as recognize compound documents directories; in such a case you might
+     * return a special icon for the directory that makes it look like a regular
+     * document, and return false for isTraversable to not allow users to
+     * descend into the directory.
+     *
+     * @see FileView#isTraversable
+     */
+    public Boolean isTraversable(File f) {
+        // if (some_reason) {
+        //    return Boolean.FALSE;
+        // }
+        return null;    // Use default from FileSystemView
+    };
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/FileChooserDemo.java	Thu Apr 12 13:28:52 2018 -0700
@@ -0,0 +1,436 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JFileChooserDemo
+ *
+ * @author Jeff Dinkins
+ */
+public class FileChooserDemo extends DemoModule {
+    JLabel theImage;
+    Icon jpgIcon;
+    Icon gifIcon;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        FileChooserDemo demo = new FileChooserDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * FileChooserDemo Constructor
+     */
+    public FileChooserDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "FileChooserDemo", "toolbar/JFileChooser.gif");
+        createFileChooserDemo();
+    }
+
+    public void createFileChooserDemo() {
+        theImage = new JLabel("");
+        jpgIcon = createImageIcon("filechooser/jpgIcon.jpg", "jpg image");
+        gifIcon = createImageIcon("filechooser/gifIcon.gif", "gif image");
+
+        JPanel demoPanel = getDemoPanel();
+        demoPanel.setLayout(new BoxLayout(demoPanel, BoxLayout.Y_AXIS));
+
+        JPanel innerPanel = new JPanel();
+        innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
+
+        demoPanel.add(Box.createRigidArea(VGAP20));
+        demoPanel.add(innerPanel);
+        demoPanel.add(Box.createRigidArea(VGAP20));
+
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // Create a panel to hold buttons
+        JPanel buttonPanel = new JPanel() {
+            public Dimension getMaximumSize() {
+                return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+            }
+        };
+        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
+
+        buttonPanel.add(Box.createRigidArea(VGAP15));
+        buttonPanel.add(createPlainFileChooserButton());
+        buttonPanel.add(Box.createRigidArea(VGAP15));
+        buttonPanel.add(createPreviewFileChooserButton());
+        buttonPanel.add(Box.createRigidArea(VGAP15));
+        buttonPanel.add(createCustomFileChooserButton());
+        buttonPanel.add(Box.createVerticalGlue());
+
+        // Create a panel to hold the image
+        JPanel imagePanel = new JPanel();
+        imagePanel.setLayout(new BorderLayout());
+        imagePanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
+        JScrollPane scroller = new JScrollPane(theImage);
+        scroller.getVerticalScrollBar().setUnitIncrement(10);
+        scroller.getHorizontalScrollBar().setUnitIncrement(10);
+        imagePanel.add(scroller, BorderLayout.CENTER);
+
+        // add buttons and image panels to inner panel
+        innerPanel.add(buttonPanel);
+        innerPanel.add(Box.createRigidArea(HGAP30));
+        innerPanel.add(imagePanel);
+        innerPanel.add(Box.createRigidArea(HGAP20));
+    }
+
+    public JFileChooser createFileChooser() {
+        // create a filechooser
+        JFileChooser fc = new JFileChooser();
+        if (getSwingSet2() != null && getSwingSet2().isDragEnabled()) {
+            fc.setDragEnabled(true);
+        }
+
+        // set the current directory to be the images directory
+        File swingFile = new File("resources/images/About.jpg");
+        if(swingFile.exists()) {
+            fc.setCurrentDirectory(swingFile);
+            fc.setSelectedFile(swingFile);
+        }
+
+        return fc;
+    }
+
+
+    public JButton createPlainFileChooserButton() {
+        Action a = new AbstractAction(getString("FileChooserDemo.plainbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                JFileChooser fc = createFileChooser();
+
+                // show the filechooser
+                int result = fc.showOpenDialog(getDemoPanel());
+
+                // if we selected an image, load the image
+                if(result == JFileChooser.APPROVE_OPTION) {
+                    loadImage(fc.getSelectedFile().getPath());
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    public JButton createPreviewFileChooserButton() {
+        Action a = new AbstractAction(getString("FileChooserDemo.previewbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                JFileChooser fc = createFileChooser();
+
+                // Add filefilter & fileview
+                javax.swing.filechooser.FileFilter filter = createFileFilter(
+                    getString("FileChooserDemo.filterdescription"),
+                    "jpg", "gif");
+                ExampleFileView fileView = new ExampleFileView();
+                fileView.putIcon("jpg", jpgIcon);
+                fileView.putIcon("gif", gifIcon);
+                fc.setFileView(fileView);
+                fc.addChoosableFileFilter(filter);
+                fc.setFileFilter(filter);
+
+                // add preview accessory
+                fc.setAccessory(new FilePreviewer(fc));
+
+                // show the filechooser
+                int result = fc.showOpenDialog(getDemoPanel());
+
+                // if we selected an image, load the image
+                if(result == JFileChooser.APPROVE_OPTION) {
+                    loadImage(fc.getSelectedFile().getPath());
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    JDialog dialog;
+    JFileChooser fc;
+
+    private javax.swing.filechooser.FileFilter createFileFilter(
+            String description, String...extensions) {
+        description = createFileNameFilterDescriptionFromExtensions(
+                    description, extensions);
+        return new FileNameExtensionFilter(description, extensions);
+    }
+
+    private String createFileNameFilterDescriptionFromExtensions(
+            String description, String[] extensions) {
+        String fullDescription = (description == null) ?
+                "(" : description + " (";
+        // build the description from the extension list
+        fullDescription += "." + extensions[0];
+        for (int i = 1; i < extensions.length; i++) {
+            fullDescription += ", .";
+            fullDescription += extensions[i];
+        }
+        fullDescription += ")";
+        return fullDescription;
+    }
+
+    public JButton createCustomFileChooserButton() {
+        Action a = new AbstractAction(getString("FileChooserDemo.custombutton")) {
+            public void actionPerformed(ActionEvent e) {
+                fc = createFileChooser();
+
+                // Add filefilter & fileview
+                javax.swing.filechooser.FileFilter filter = createFileFilter(
+                    getString("FileChooserDemo.filterdescription"),
+                    "jpg", "gif");
+                ExampleFileView fileView = new ExampleFileView();
+                fileView.putIcon("jpg", jpgIcon);
+                fileView.putIcon("gif", gifIcon);
+                fc.setFileView(fileView);
+                fc.addChoosableFileFilter(filter);
+
+                // add preview accessory
+                fc.setAccessory(new FilePreviewer(fc));
+
+                // remove the approve/cancel buttons
+                fc.setControlButtonsAreShown(false);
+
+                // make custom controls
+                //wokka
+                JPanel custom = new JPanel();
+                custom.setLayout(new BoxLayout(custom, BoxLayout.Y_AXIS));
+                custom.add(Box.createRigidArea(VGAP10));
+                JLabel description = new JLabel(getString("FileChooserDemo.description"));
+                description.setAlignmentX(JLabel.CENTER_ALIGNMENT);
+                custom.add(description);
+                custom.add(Box.createRigidArea(VGAP10));
+                custom.add(fc);
+
+                Action okAction = createOKAction();
+                fc.addActionListener(okAction);
+
+                JPanel buttons = new JPanel();
+                buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createImageButton(createFindAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createButton(createAboutAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createButton(okAction));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createButton(createCancelAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createImageButton(createHelpAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+
+                custom.add(buttons);
+                custom.add(Box.createRigidArea(VGAP10));
+
+                // show the filechooser
+                Frame parent = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, getDemoPanel());
+                dialog = new JDialog(parent, getString("FileChooserDemo.dialogtitle"), true);
+                dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+                dialog.getContentPane().add(custom, BorderLayout.CENTER);
+                dialog.pack();
+                dialog.setLocationRelativeTo(getDemoPanel());
+                dialog.show();
+            }
+        };
+        return createButton(a);
+    }
+
+    public Action createAboutAction() {
+        return new AbstractAction(getString("FileChooserDemo.about")) {
+            public void actionPerformed(ActionEvent e) {
+                File file = fc.getSelectedFile();
+                String text;
+                if(file == null) {
+                    text = getString("FileChooserDemo.nofileselected");
+                } else {
+                    text = "<html>" + getString("FileChooserDemo.thefile");
+                    text += "<br><font color=green>" + file.getName() + "</font><br>";
+                    text += getString("FileChooserDemo.isprobably") + "</html>";
+                }
+                JOptionPane.showMessageDialog(getDemoPanel(), text);
+            }
+        };
+    }
+
+    public Action createOKAction() {
+        return new AbstractAction(getString("FileChooserDemo.ok")) {
+            public void actionPerformed(ActionEvent e) {
+                dialog.dispose();
+                if (!e.getActionCommand().equals(JFileChooser.CANCEL_SELECTION)
+                    && fc.getSelectedFile() != null) {
+
+                    loadImage(fc.getSelectedFile().getPath());
+                }
+            }
+        };
+    }
+
+    public Action createCancelAction() {
+        return new AbstractAction(getString("FileChooserDemo.cancel")) {
+            public void actionPerformed(ActionEvent e) {
+                dialog.dispose();
+            }
+        };
+    }
+
+    public Action createFindAction() {
+        Icon icon = createImageIcon("filechooser/find.gif", getString("FileChooserDemo.find"));
+        return new AbstractAction("", icon) {
+            public void actionPerformed(ActionEvent e) {
+                String result = JOptionPane.showInputDialog(getDemoPanel(), getString("FileChooserDemo.findquestion"));
+                if (result != null) {
+                    JOptionPane.showMessageDialog(getDemoPanel(), getString("FileChooserDemo.findresponse"));
+                }
+            }
+        };
+    }
+
+    public Action createHelpAction() {
+        Icon icon = createImageIcon("filechooser/help.gif", getString("FileChooserDemo.help"));
+        return new AbstractAction("", icon) {
+            public void actionPerformed(ActionEvent e) {
+                JOptionPane.showMessageDialog(getDemoPanel(), getString("FileChooserDemo.helptext"));
+            }
+        };
+    }
+
+    class MyImageIcon extends ImageIcon {
+        public MyImageIcon(String filename) {
+            super(filename);
+        };
+        public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
+            g.setColor(Color.white);
+            g.fillRect(0,0, c.getWidth(), c.getHeight());
+            if(getImageObserver() == null) {
+                g.drawImage(
+                    getImage(),
+                    c.getWidth()/2 - getIconWidth()/2,
+                    c.getHeight()/2 - getIconHeight()/2,
+                    c
+                );
+            } else {
+                g.drawImage(
+                    getImage(),
+                    c.getWidth()/2 - getIconWidth()/2,
+                    c.getHeight()/2 - getIconHeight()/2,
+                    getImageObserver()
+                );
+            }
+        }
+    }
+
+    public void loadImage(String filename) {
+        theImage.setIcon(new MyImageIcon(filename));
+    }
+
+    public JButton createButton(Action a) {
+        JButton b = new JButton(a) {
+            public Dimension getMaximumSize() {
+                int width = Short.MAX_VALUE;
+                int height = super.getMaximumSize().height;
+                return new Dimension(width, height);
+            }
+        };
+        return b;
+    }
+
+    public JButton createImageButton(Action a) {
+        JButton b = new JButton(a);
+        b.setMargin(new Insets(0,0,0,0));
+        return b;
+    }
+}
+
+class FilePreviewer extends JComponent implements PropertyChangeListener {
+    ImageIcon thumbnail = null;
+
+    public FilePreviewer(JFileChooser fc) {
+        setPreferredSize(new Dimension(100, 50));
+        fc.addPropertyChangeListener(this);
+        setBorder(new BevelBorder(BevelBorder.LOWERED));
+    }
+
+    public void loadImage(File f) {
+        if (f == null) {
+            thumbnail = null;
+        } else {
+            ImageIcon tmpIcon = new ImageIcon(f.getPath());
+            if(tmpIcon.getIconWidth() > 90) {
+                thumbnail = new ImageIcon(
+                    tmpIcon.getImage().getScaledInstance(90, -1, Image.SCALE_DEFAULT));
+            } else {
+                thumbnail = tmpIcon;
+            }
+        }
+    }
+
+    public void propertyChange(PropertyChangeEvent e) {
+        String prop = e.getPropertyName();
+        if(prop == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {
+            if(isShowing()) {
+                loadImage((File) e.getNewValue());
+                repaint();
+            }
+        }
+    }
+
+    public void paint(Graphics g) {
+        super.paint(g);
+        if(thumbnail != null) {
+            int x = getWidth()/2 - thumbnail.getIconWidth()/2;
+            int y = getHeight()/2 - thumbnail.getIconHeight()/2;
+            if(y < 0) {
+