Merge
authoramurillo
Tue, 19 May 2015 11:40:00 -0700
changeset 30677 59b772a18fac
parent 30658 3b1ad397517c (diff)
parent 30676 0545deee4403 (current diff)
child 30678 a8b7fd8ede97
Merge
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/Main.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/AbstractJavaHeapObjectVisitor.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ArrayTypeCodes.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/HackJavaValue.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaBoolean.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaByte.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaChar.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaClass.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaDouble.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaField.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaFloat.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaHeapObject.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaHeapObjectVisitor.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaInt.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaLazyReadObject.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaLong.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObject.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObjectArray.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObjectRef.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaShort.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaThing.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValue.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableExcludes.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableExcludesImpl.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableObjects.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReferenceChain.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/Root.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/Snapshot.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/StackFrame.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/StackTrace.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLEngine.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLException.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/ObjectVisitor.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/FileReadBuffer.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/MappedReadBuffer.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/PositionDataInputStream.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/PositionInputStream.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/ReadBuffer.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/Reader.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/AllClassesQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/AllRootsQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ClassQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/FinalizerObjectsQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/FinalizerSummaryQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/HistogramQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/HttpReader.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/InstancesCountQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/InstancesQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/OQLHelp.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/OQLQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ObjectQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/PlatformClasses.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/QueryHandler.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/QueryListener.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ReachableQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RefsByTypeQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RootStackQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RootsQuery.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/ArraySorter.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Comparer.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/CompositeEnumeration.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/VectorSorter.java
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/resources/hat.js
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/resources/oqlhelp.html
jdk/src/jdk.dev/share/classes/com/sun/tools/hat/resources/platform_names.txt
jdk/test/com/sun/management/HotSpotDiagnosticMXBean/DumpHeap.sh
jdk/test/sun/tools/common/ApplicationSetup.sh
jdk/test/sun/tools/common/CommonSetup.sh
jdk/test/sun/tools/common/ShutdownSimpleApplication.java
jdk/test/sun/tools/common/SimpleApplication.java
jdk/test/sun/tools/common/SleeperApplication.java
jdk/test/sun/tools/jhat/HatHeapDump1Test.java
jdk/test/sun/tools/jhat/HelloWorld.java
jdk/test/sun/tools/jhat/ParseTest.sh
jdk/test/sun/tools/jhat/README.TXT
--- a/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -306,3 +306,4 @@
 ac3f5a39d4ff14d70c365e12cf5ec8f2abd52a04 jdk9-b61
 e7dbbef69d12b6a74dfad331b7188e7f893e8d29 jdk9-b62
 989253a902c34dcb7564695161c9200a5fbb7412 jdk9-b63
+8ffdeabc7c2b9a8280bf46cae026ac46b4d31c26 jdk9-b64
--- a/.hgtags-top-repo	Thu May 14 12:05:33 2015 -0700
+++ b/.hgtags-top-repo	Tue May 19 11:40:00 2015 -0700
@@ -306,3 +306,4 @@
 ea38728b4f4bdd8fd0d7a89b18069f521cf05013 jdk9-b61
 105d045a69174d870b69bfe471b3f2d05a9f8ecc jdk9-b62
 0b32ed628fa60e4ab99fb0b5866d648e16231f17 jdk9-b63
+82cf9aab9a83e41c8194ba01af9666afdb856cbe jdk9-b64
--- a/common/autoconf/basics.m4	Thu May 14 12:05:33 2015 -0700
+++ b/common/autoconf/basics.m4	Tue May 19 11:40:00 2015 -0700
@@ -705,9 +705,9 @@
       # is performed.
       filtered_files=`$ECHO "$files_present" \
           | $SED -e 's/config.log//g' \
-	      -e 's/confdefs.h//g' \
-	      -e 's/fixpath.exe//g' \
-	      -e 's/ //g' \
+              -e 's/configure.log//g' \
+              -e 's/confdefs.h//g' \
+              -e 's/ //g' \
           | $TR -d '\n'`
       if test "x$filtered_files" != x; then
         AC_MSG_NOTICE([Current directory is $CURDIR.])
@@ -1054,3 +1054,29 @@
 
   AC_SUBST(BASH_ARGS)
 ])
+
+# Code to run after AC_OUTPUT
+AC_DEFUN_ONCE([BASIC_POST_CONFIG_OUTPUT],
+[
+  # Try to move config.log (generated by autoconf) to the configure-support directory.
+  if test -e ./config.log; then
+    $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
+  fi
+
+  # Rotate our log file (configure.log)
+  if test -e "$OUTPUT_ROOT/configure.log.old"; then
+    $RM -f "$OUTPUT_ROOT/configure.log.old"
+  fi
+  if test -e "$OUTPUT_ROOT/configure.log"; then
+    $MV -f "$OUTPUT_ROOT/configure.log" "$OUTPUT_ROOT/configure.log.old" 2> /dev/null
+  fi
+
+  # Move configure.log from current directory to the build output root
+  if test -e ./configure.log; then
+    echo found it
+    $MV -f ./configure.log "$OUTPUT_ROOT/configure.log" 2> /dev/null
+  fi
+
+  # Make the compare script executable
+  $CHMOD +x $OUTPUT_ROOT/compare.sh
+])
--- a/common/autoconf/configure	Thu May 14 12:05:33 2015 -0700
+++ b/common/autoconf/configure	Tue May 19 11:40:00 2015 -0700
@@ -255,13 +255,10 @@
   set -x
 fi
 
-if test "x$conf_debug_configure" = xtrue; then
-  # Turn on logging, but don't turn on twice when called recursive
-  conf_debug_logfile=./debug-configure.log
-  (exec 3>&1 ; (. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) | tee -a $conf_debug_logfile 1>&2 ; exec 3>&-) | tee -a $conf_debug_logfile
-else
-  ( . $conf_script_to_run "${conf_processed_arguments[@]}" )
-fi
+# Now transfer control to the script generated by autoconf. This is where the
+# main work is done.
+conf_logfile=./configure.log
+(exec 3>&1 ; (. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile
 
 conf_result_code=$?
 ###
--- a/common/autoconf/configure.ac	Thu May 14 12:05:33 2015 -0700
+++ b/common/autoconf/configure.ac	Tue May 19 11:40:00 2015 -0700
@@ -265,15 +265,10 @@
 
 # Create the actual output files. Now the main work of configure is done.
 AC_OUTPUT
+
+# After AC_OUTPUT, we need to do final work
 CUSTOM_CONFIG_OUTPUT_GENERATED_HOOK
-
-# Try to move the config.log file to the output directory.
-if test -e ./config.log; then
-  $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
-fi
-
-# Make the compare script executable
-$CHMOD +x $OUTPUT_ROOT/compare.sh
+BASIC_POST_CONFIG_OUTPUT
 
 # Finally output some useful information to the user
 HELP_PRINT_SUMMARY_AND_WARNINGS
--- a/common/autoconf/flags.m4	Thu May 14 12:05:33 2015 -0700
+++ b/common/autoconf/flags.m4	Tue May 19 11:40:00 2015 -0700
@@ -231,7 +231,6 @@
 
   AC_SUBST(C_FLAG_REORDER)
   AC_SUBST(CXX_FLAG_REORDER)
-  AC_SUBST(SHARED_LIBRARY_FLAGS)
   AC_SUBST(SET_EXECUTABLE_ORIGIN)
   AC_SUBST(SET_SHARED_LIBRARY_ORIGIN)
   AC_SUBST(SET_SHARED_LIBRARY_NAME)
@@ -524,6 +523,10 @@
   #    CXXFLAGS_JDK  - C++ Compiler flags
   #    COMMON_CCXXFLAGS_JDK - common to C and C++
   if test "x$TOOLCHAIN_TYPE" = xgcc; then
+    if test "x$OPENJDK_TARGET_CPU" = xx86; then
+      # Force compatibility with i586 on 32 bit intel platforms.
+      COMMON_CCXXFLAGS="${COMMON_CCXXFLAGS} -march=i586"
+    fi
     COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
         -pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
     case $OPENJDK_TARGET_CPU_ARCH in
@@ -900,6 +903,24 @@
       [COMPILER_SUPPORTS_TARGET_BITS_FLAG=false])
   AC_SUBST(COMPILER_SUPPORTS_TARGET_BITS_FLAG)
 
+  AC_ARG_ENABLE([warnings-as-errors], [AS_HELP_STRING([--disable-warnings-as-errors],
+      [do not consider native warnings to be an error @<:@enabled@:>@])])
+
+  AC_MSG_CHECKING([if native warnings are errors])
+  if test "x$enable_warnings_as_errors" = "xyes"; then
+    AC_MSG_RESULT([yes (explicitely set)])
+    WARNINGS_AS_ERRORS=true
+  elif test "x$enable_warnings_as_errors" = "xno"; then
+    AC_MSG_RESULT([no])
+    WARNINGS_AS_ERRORS=false
+  elif test "x$enable_warnings_as_errors" = "x"; then
+    AC_MSG_RESULT([yes (default)])
+    WARNINGS_AS_ERRORS=true
+  else
+    AC_MSG_ERROR([--enable-warnings-as-errors accepts no argument])
+  fi
+  AC_SUBST(WARNINGS_AS_ERRORS)
+
   case "${TOOLCHAIN_TYPE}" in
     microsoft)
       DISABLE_WARNING_PREFIX="-wd"
--- a/common/autoconf/generated-configure.sh	Thu May 14 12:05:33 2015 -0700
+++ b/common/autoconf/generated-configure.sh	Tue May 19 11:40:00 2015 -0700
@@ -684,6 +684,7 @@
 ENABLE_DEBUG_SYMBOLS
 CFLAGS_WARNINGS_ARE_ERRORS
 DISABLE_WARNING_PREFIX
+WARNINGS_AS_ERRORS
 COMPILER_SUPPORTS_TARGET_BITS_FLAG
 ZERO_ARCHFLAG
 LDFLAGS_TESTEXE_SUFFIX
@@ -727,7 +728,6 @@
 SET_SHARED_LIBRARY_NAME
 SET_SHARED_LIBRARY_ORIGIN
 SET_EXECUTABLE_ORIGIN
-SHARED_LIBRARY_FLAGS
 CXX_FLAG_REORDER
 C_FLAG_REORDER
 SYSROOT_LDFLAGS
@@ -1086,6 +1086,7 @@
 with_extra_cflags
 with_extra_cxxflags
 with_extra_ldflags
+enable_warnings_as_errors
 enable_debug_symbols
 enable_zip_debug_info
 enable_native_coverage
@@ -1852,6 +1853,9 @@
   --enable-rmiconnector-iiop
                           enable the JMX RMIConnector iiop transport
                           [disabled]
+  --disable-warnings-as-errors
+                          do not consider native warnings to be an error
+                          [enabled]
   --disable-debug-symbols disable generation of debug symbols [enabled]
   --disable-zip-debug-info
                           disable zipping of debug-info files [enabled]
@@ -3496,6 +3500,9 @@
 # Check for support for specific options in bash
 
 
+# Code to run after AC_OUTPUT
+
+
 #
 # Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -4359,7 +4366,7 @@
 #CUSTOM_AUTOCONF_INCLUDE
 
 # Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1430918902
+DATE_WHEN_GENERATED=1431429776
 
 ###############################################################################
 #
@@ -15335,9 +15342,9 @@
       # is performed.
       filtered_files=`$ECHO "$files_present" \
           | $SED -e 's/config.log//g' \
-	      -e 's/confdefs.h//g' \
-	      -e 's/fixpath.exe//g' \
-	      -e 's/ //g' \
+              -e 's/configure.log//g' \
+              -e 's/confdefs.h//g' \
+              -e 's/ //g' \
           | $TR -d '\n'`
       if test "x$filtered_files" != x; then
         { $as_echo "$as_me:${as_lineno-$LINENO}: Current directory is $CURDIR." >&5
@@ -41761,7 +41768,6 @@
 
 
 
-
   if test "x$OPENJDK_TARGET_OS" = xsolaris; then
     CFLAGS_JDK="${CFLAGS_JDK} -D__solaris__"
     CXXFLAGS_JDK="${CXXFLAGS_JDK} -D__solaris__"
@@ -42029,6 +42035,10 @@
   #    CXXFLAGS_JDK  - C++ Compiler flags
   #    COMMON_CCXXFLAGS_JDK - common to C and C++
   if test "x$TOOLCHAIN_TYPE" = xgcc; then
+    if test "x$OPENJDK_TARGET_CPU" = xx86; then
+      # Force compatibility with i586 on 32 bit intel platforms.
+      COMMON_CCXXFLAGS="${COMMON_CCXXFLAGS} -march=i586"
+    fi
     COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
         -pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
     case $OPENJDK_TARGET_CPU_ARCH in
@@ -42471,6 +42481,31 @@
 
 
 
+  # Check whether --enable-warnings-as-errors was given.
+if test "${enable_warnings_as_errors+set}" = set; then :
+  enableval=$enable_warnings_as_errors;
+fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if native warnings are errors" >&5
+$as_echo_n "checking if native warnings are errors... " >&6; }
+  if test "x$enable_warnings_as_errors" = "xyes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (explicitely set)" >&5
+$as_echo "yes (explicitely set)" >&6; }
+    WARNINGS_AS_ERRORS=true
+  elif test "x$enable_warnings_as_errors" = "xno"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    WARNINGS_AS_ERRORS=false
+  elif test "x$enable_warnings_as_errors" = "x"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5
+$as_echo "yes (default)" >&6; }
+    WARNINGS_AS_ERRORS=true
+  else
+    as_fn_error $? "--enable-warnings-as-errors accepts no argument" "$LINENO" 5
+  fi
+
+
   case "${TOOLCHAIN_TYPE}" in
     microsoft)
       DISABLE_WARNING_PREFIX="-wd"
@@ -54179,14 +54214,31 @@
 fi
 
 
-
-# Try to move the config.log file to the output directory.
-if test -e ./config.log; then
-  $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
-fi
-
-# Make the compare script executable
-$CHMOD +x $OUTPUT_ROOT/compare.sh
+# After AC_OUTPUT, we need to do final work
+
+
+  # Try to move config.log (generated by autoconf) to the configure-support directory.
+  if test -e ./config.log; then
+    $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
+  fi
+
+  # Rotate our log file (configure.log)
+  if test -e "$OUTPUT_ROOT/configure.log.old"; then
+    $RM -f "$OUTPUT_ROOT/configure.log.old"
+  fi
+  if test -e "$OUTPUT_ROOT/configure.log"; then
+    $MV -f "$OUTPUT_ROOT/configure.log" "$OUTPUT_ROOT/configure.log.old" 2> /dev/null
+  fi
+
+  # Move configure.log from current directory to the build output root
+  if test -e ./configure.log; then
+    echo found it
+    $MV -f ./configure.log "$OUTPUT_ROOT/configure.log" 2> /dev/null
+  fi
+
+  # Make the compare script executable
+  $CHMOD +x $OUTPUT_ROOT/compare.sh
+
 
 # Finally output some useful information to the user
 
@@ -54280,14 +54332,20 @@
 
 
 
-if test -e "$OUTPUT_ROOT/config.log"; then
-  $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" > /dev/null 2>&1
-  if test $? -eq 0; then
-    printf "The following warnings were produced. Repeated here for convenience:\n"
-    # We must quote sed expression (using []) to stop m4 from eating the [].
-    $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" | $SED -e  's/^configure:[0-9]*: //'
-    printf "\n"
-  fi
-fi
-
-
+  # Locate config.log.
+  if test -e "$CONFIGURESUPPORT_OUTPUTDIR/config.log"; then
+    CONFIG_LOG_PATH="$CONFIGURESUPPORT_OUTPUTDIR"
+  elif test -e "./config.log"; then
+    CONFIG_LOG_PATH="."
+  fi
+
+  if test -e "$CONFIG_LOG_PATH/config.log"; then
+    $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" > /dev/null 2>&1
+    if test $? -eq 0; then
+      printf "The following warnings were produced. Repeated here for convenience:\n"
+      # We must quote sed expression (using []) to stop m4 from eating the [].
+      $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" | $SED -e  's/^configure:[0-9]*: //'
+      printf "\n"
+    fi
+  fi
+
--- a/common/autoconf/help.m4	Thu May 14 12:05:33 2015 -0700
+++ b/common/autoconf/help.m4	Tue May 19 11:40:00 2015 -0700
@@ -212,7 +212,7 @@
   if test "x$TOOLCHAIN_VERSION" != "x"; then
     print_version=" $TOOLCHAIN_VERSION"
   fi
-  printf "* Toolchain:      $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION$print_version)\n" 
+  printf "* Toolchain:      $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION$print_version)\n"
   printf "* C Compiler:     Version $CC_VERSION_NUMBER (at $CC)\n"
   printf "* C++ Compiler:   Version $CXX_VERSION_NUMBER (at $CXX)\n"
 
@@ -263,14 +263,20 @@
 
 AC_DEFUN_ONCE([HELP_REPEAT_WARNINGS],
 [
-if test -e "$OUTPUT_ROOT/config.log"; then
-  $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" > /dev/null 2>&1
-  if test $? -eq 0; then
-    printf "The following warnings were produced. Repeated here for convenience:\n"
-    # We must quote sed expression (using []) to stop m4 from eating the [].
-    $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" | $SED -e [ 's/^configure:[0-9]*: //' ]
-    printf "\n"
+  # Locate config.log.
+  if test -e "$CONFIGURESUPPORT_OUTPUTDIR/config.log"; then
+    CONFIG_LOG_PATH="$CONFIGURESUPPORT_OUTPUTDIR"
+  elif test -e "./config.log"; then
+    CONFIG_LOG_PATH="."
   fi
-fi
 
+  if test -e "$CONFIG_LOG_PATH/config.log"; then
+    $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" > /dev/null 2>&1
+    if test $? -eq 0; then
+      printf "The following warnings were produced. Repeated here for convenience:\n"
+      # We must quote sed expression (using []) to stop m4 from eating the [].
+      $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" | $SED -e [ 's/^configure:[0-9]*: //' ]
+      printf "\n"
+    fi
+  fi
 ])
--- a/common/autoconf/spec.gmk.in	Thu May 14 12:05:33 2015 -0700
+++ b/common/autoconf/spec.gmk.in	Tue May 19 11:40:00 2015 -0700
@@ -321,6 +321,9 @@
 DISABLE_WARNING_PREFIX := @DISABLE_WARNING_PREFIX@
 CFLAGS_WARNINGS_ARE_ERRORS:=@CFLAGS_WARNINGS_ARE_ERRORS@
 
+# A global flag (true or false) determining if native warnings are considered errors.
+WARNINGS_AS_ERRORS := @WARNINGS_AS_ERRORS@
+
 CFLAGS_CCACHE:=@CFLAGS_CCACHE@
 
 # Tools that potentially need to be cross compilation aware.
@@ -394,9 +397,6 @@
 
 LIPO:=@LIPO@
 
-# Command to create a shared library
-SHARED_LIBRARY_FLAGS:=@SHARED_LIBRARY_FLAGS@
-
 # Options to linker to specify a mapfile.
 # (Note absence of := assignment, because we do not want to evaluate the macro body here)
 SET_SHARED_LIBRARY_MAPFILE=@SET_SHARED_LIBRARY_MAPFILE@
--- a/corba/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/corba/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -306,3 +306,4 @@
 d690f489ca0bb95a6157d996da2fa72bcbcf02ea jdk9-b61
 d27f7e0a7aca129969de23e9934408a31b4abf4c jdk9-b62
 0acac6937de7a0868f8c6f88b7d036d780abeee6 jdk9-b63
+0a5e5a7c3539e8bde73d9fe55750e49a49cb8dac jdk9-b64
--- a/hotspot/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -466,3 +466,4 @@
 715d2da5801c410746e92f08066d53bde1496286 jdk9-b61
 1eab877142cce6ca06e556e2ad0af688f993f00b jdk9-b62
 2ac9b6b36689b50d1562627067c92d51781b5684 jdk9-b63
+bf92b8db249cdfa5651ef954b6c0743a7e0ea4cd jdk9-b64
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad	Tue May 19 11:40:00 2015 -0700
@@ -810,9 +810,6 @@
   bool unnecessary_volatile(const Node *barrier);
   bool needs_releasing_store(const Node *store);
 
-  // Use barrier instructions rather than load acquire / store
-  // release.
-  const bool UseBarriersForVolatile = false;
   // Use barrier instructions for unsafe volatile gets rather than
   // trying to identify an exact signature for them
   const bool UseBarriersForUnsafeVolatileGet = false;
--- a/hotspot/src/cpu/aarch64/vm/globals_aarch64.hpp	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/src/cpu/aarch64/vm/globals_aarch64.hpp	Tue May 19 11:40:00 2015 -0700
@@ -98,8 +98,8 @@
   product(bool, NearCpool, true,                                        \
          "constant pool is close to instructions")                      \
                                                                         \
-  notproduct(bool, UseAcqRelForVolatileFields, false,                   \
-             "Use acquire and release insns for volatile fields")       \
+  product(bool, UseBarriersForVolatile, false,                          \
+          "Use memory barriers to implement volatile accesses")         \
                                                                         \
   product(bool, UseCRC32, false,                                        \
           "Use CRC32 instructions for CRC32 computation")               \
@@ -117,8 +117,8 @@
   product(bool, NearCpool, true,                                        \
          "constant pool is close to instructions")                      \
                                                                         \
-  notproduct(bool, UseAcqRelForVolatileFields, false,                   \
-             "Use acquire and release insns for volatile fields")       \
+  product(bool, UseBarriersForVolatile, false,                          \
+          "Use memory barriers to implement volatile accesses")         \
   product(bool, UseNeon, false,                                         \
           "Use Neon for CRC32 computation")                             \
   product(bool, UseCRC32, false,                                        \
--- a/hotspot/src/cpu/aarch64/vm/interp_masm_aarch64.cpp	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/src/cpu/aarch64/vm/interp_masm_aarch64.cpp	Tue May 19 11:40:00 2015 -0700
@@ -1314,7 +1314,7 @@
     // case_array_offset_in_bytes()
     movw(reg2, in_bytes(MultiBranchData::per_case_size()));
     movw(rscratch1, in_bytes(MultiBranchData::case_array_offset()));
-    maddw(index, index, reg2, rscratch1);
+    Assembler::maddw(index, index, reg2, rscratch1);
 
     // Update the case count
     increment_mdp_data_at(mdp,
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp	Tue May 19 11:40:00 2015 -0700
@@ -1625,7 +1625,7 @@
     sdivw(result, ra, rb);
   } else {
     sdivw(scratch, ra, rb);
-    msubw(result, scratch, rb, ra);
+    Assembler::msubw(result, scratch, rb, ra);
   }
 
   return idivl_offset;
@@ -1655,7 +1655,7 @@
     sdiv(result, ra, rb);
   } else {
     sdiv(scratch, ra, rb);
-    msub(result, scratch, rb, ra);
+    Assembler::msub(result, scratch, rb, ra);
   }
 
   return idivq_offset;
@@ -3787,14 +3787,6 @@
   }
 }
 
-  bool MacroAssembler::use_acq_rel_for_volatile_fields() {
-#ifdef PRODUCT
-    return false;
-#else
-    return UseAcqRelForVolatileFields;
-#endif
-  }
-
 void MacroAssembler::build_frame(int framesize) {
   if (framesize == 0) {
     // Is this even possible?
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp	Tue May 19 11:40:00 2015 -0700
@@ -405,6 +405,18 @@
     umaddl(Rd, Rn, Rm, zr);
   }
 
+#define WRAP(INSN)                                                            \
+  void INSN(Register Rd, Register Rn, Register Rm, Register Ra) {             \
+    if ((VM_Version::cpu_cpuFeatures() & VM_Version::CPU_A53MAC) && Ra != zr) \
+      nop();                                                                  \
+    Assembler::INSN(Rd, Rn, Rm, Ra);                                          \
+  }
+
+  WRAP(madd) WRAP(msub) WRAP(maddw) WRAP(msubw)
+  WRAP(smaddl) WRAP(smsubl) WRAP(umaddl) WRAP(umsubl)
+#undef WRAP
+
+
   // macro assembly operations needed for aarch64
 
   // first two private routines for loading 32 bit or 64 bit constants
@@ -1094,9 +1106,6 @@
   address read_polling_page(Register r, address page, relocInfo::relocType rtype);
   address read_polling_page(Register r, relocInfo::relocType rtype);
 
-  // Used by aarch64.ad to control code generation
-  static bool use_acq_rel_for_volatile_fields();
-
   // CRC32 code for java.util.zip.CRC32::updateBytes() instrinsic.
   void update_byte_crc32(Register crc, Register val, Register table);
   void update_word_crc32(Register crc, Register v, Register tmp,
@@ -1150,10 +1159,6 @@
                             int offset, int size);
 };
 
-// Used by aarch64.ad to control code generation
-#define treat_as_volatile(MEM_NODE)                                     \
-  (MacroAssembler::use_acq_rel_for_volatile_fields() ? (MEM_NODE)->is_volatile() : false)
-
 #ifdef ASSERT
 inline bool AbstractAssembler::pd_check_instruction_mark() { return false; }
 #endif
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp	Tue May 19 11:40:00 2015 -0700
@@ -59,6 +59,9 @@
 
 int VM_Version::_cpu;
 int VM_Version::_model;
+int VM_Version::_model2;
+int VM_Version::_variant;
+int VM_Version::_revision;
 int VM_Version::_stepping;
 int VM_Version::_cpuFeatures;
 const char*           VM_Version::_features_str = "";
@@ -122,13 +125,47 @@
 
   char buf[512];
 
-  strcpy(buf, "simd");
+  _cpuFeatures = auxv;
+
+  int cpu_lines = 0;
+  if (FILE *f = fopen("/proc/cpuinfo", "r")) {
+    char buf[128], *p;
+    while (fgets(buf, sizeof (buf), f) != NULL) {
+      if (p = strchr(buf, ':')) {
+        long v = strtol(p+1, NULL, 0);
+        if (strncmp(buf, "CPU implementer", sizeof "CPU implementer" - 1) == 0) {
+          _cpu = v;
+          cpu_lines++;
+        } else if (strncmp(buf, "CPU variant", sizeof "CPU variant" - 1) == 0) {
+          _variant = v;
+        } else if (strncmp(buf, "CPU part", sizeof "CPU part" - 1) == 0) {
+          if (_model != v)  _model2 = _model;
+          _model = v;
+        } else if (strncmp(buf, "CPU revision", sizeof "CPU revision" - 1) == 0) {
+          _revision = v;
+        }
+      }
+    }
+    fclose(f);
+  }
+
+  // Enable vendor specific features
+  if (_cpu == CPU_CAVIUM && _variant == 0) _cpuFeatures |= CPU_DMB_ATOMICS;
+  if (_cpu == CPU_ARM && (_model == 0xd03 || _model2 == 0xd03)) _cpuFeatures |= CPU_A53MAC;
+  // If an olde style /proc/cpuinfo (cpu_lines == 1) then if _model is an A57 (0xd07)
+  // we assume the worst and assume we could be on a big little system and have
+  // undisclosed A53 cores which we could be swapped to at any stage
+  if (_cpu == CPU_ARM && cpu_lines == 1 && _model == 0xd07) _cpuFeatures |= CPU_A53MAC;
+
+  sprintf(buf, "0x%02x:0x%x:0x%03x:%d", _cpu, _variant, _model, _revision);
+  if (_model2) sprintf(buf+strlen(buf), "(0x%03x)", _model2);
+  if (auxv & HWCAP_ASIMD) strcat(buf, ", simd");
   if (auxv & HWCAP_CRC32) strcat(buf, ", crc");
   if (auxv & HWCAP_AES)   strcat(buf, ", aes");
   if (auxv & HWCAP_SHA1)  strcat(buf, ", sha1");
   if (auxv & HWCAP_SHA2)  strcat(buf, ", sha256");
 
-  _features_str = strdup(buf);
+  _features_str = os::strdup(buf);
 
   if (FLAG_IS_DEFAULT(UseCRC32)) {
     UseCRC32 = (auxv & HWCAP_CRC32) != 0;
@@ -202,6 +239,10 @@
     UseMultiplyToLenIntrinsic = true;
   }
 
+  if (FLAG_IS_DEFAULT(UseBarriersForVolatile)) {
+    UseBarriersForVolatile = (_cpuFeatures & CPU_DMB_ATOMICS) != 0;
+  }
+
 #ifdef COMPILER2
   if (FLAG_IS_DEFAULT(OptoScheduling)) {
     OptoScheduling = true;
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp	Thu May 14 12:05:33 2015 -0700
+++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp	Tue May 19 11:40:00 2015 -0700
@@ -34,6 +34,9 @@
 protected:
   static int _cpu;
   static int _model;
+  static int _model2;
+  static int _variant;
+  static int _revision;
   static int _stepping;
   static int _cpuFeatures;     // features returned by the "cpuid" instruction
                                // 0 if this instruction is not available
@@ -49,7 +52,40 @@
   static void assert_is_initialized() {
   }
 
+  enum {
+    CPU_ARM       = 'A',
+    CPU_BROADCOM  = 'B',
+    CPU_CAVIUM    = 'C',
+    CPU_DEC       = 'D',
+    CPU_INFINEON  = 'I',
+    CPU_MOTOROLA  = 'M',
+    CPU_NVIDIA    = 'N',
+    CPU_AMCC      = 'P',
+    CPU_QUALCOM   = 'Q',
+    CPU_MARVELL   = 'V',
+    CPU_INTEL     = 'i',
+  } cpuFamily;
+
+  enum {
+    CPU_FP           = (1<<0),
+    CPU_ASIMD        = (1<<1),
+    CPU_EVTSTRM      = (1<<2),
+    CPU_AES          = (1<<3),
+    CPU_PMULL        = (1<<4),
+    CPU_SHA1         = (1<<5),
+    CPU_SHA2         = (1<<6),
+    CPU_CRC32        = (1<<7),
+    CPU_A53MAC       = (1 << 30),
+    CPU_DMB_ATOMICS  = (1 << 31),
+  } cpuFeatureFlags;
+
   static const char* cpu_features()           { return _features_str; }
+  static int cpu_family()                     { return _cpu; }
+  static int cpu_model()                      { return _model; }
+  static int cpu_model2()                     { return _model2; }
+  static int cpu_variant()                    { return _variant; }
+  static int cpu_revision()                   { return _revision; }
+  static int cpu_cpuFeatures()                { return _cpuFeatures; }
 
 };
 
--- a/jaxp/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/jaxp/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -306,3 +306,4 @@
 f4a4a54620370f077c2e830a5561c8cfa811712b jdk9-b61
 3bcf83c1bbc1b7663e930d72c133a9bd86c7618d jdk9-b62
 4a8f895f0317dcc90479cb7cc97014312e69edf7 jdk9-b63
+6f91749b5aaef1a171ec2254163233438d1071d1 jdk9-b64
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/dom/MultiDOM.java	Thu May 14 12:05:33 2015 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/dom/MultiDOM.java	Tue May 19 11:40:00 2015 -0700
@@ -567,8 +567,12 @@
     }
 
     public NodeList makeNodeList(DTMAxisIterator iter) {
-        // TODO: gather nodes from all DOMs ?
-        return _main.makeNodeList(iter);
+        int index = iter.next();
+        if (index == DTM.NULL) {
+            return null;
+        }
+        iter.reset();
+        return _adapters[getDTMId(index)].makeNodeList(iter);
     }
 
     public String getLanguage(int node) {
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java	Thu May 14 12:05:33 2015 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java	Tue May 19 11:40:00 2015 -0700
@@ -1,7 +1,7 @@
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  *
- * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
  *
  * The contents of this file are subject to the terms of either the GNU
  * General Public License Version 2 only ("GPL") or the Common Development
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java	Thu May 14 12:05:33 2015 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 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
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java	Thu May 14 12:05:33 2015 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 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
--- a/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathEvaluationResult.java	Thu May 14 12:05:33 2015 -0700
+++ b/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathEvaluationResult.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
--- a/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathNodes.java	Thu May 14 12:05:33 2015 -0700
+++ b/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathNodes.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/transform/DocumentExtFunc.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.xml.transform;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class DocumentExtFunc {
+
+    public static String test(NodeList list) {
+        Node node = list.item(0);
+        return "["+node.getNodeName() + ":" + node.getNodeValue()+"]";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/transform/XSLTFunctionsTest.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.xml.transform;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+
+/*
+ * @summary This class contains tests for XSLT functions.
+ */
+
+public class XSLTFunctionsTest {
+
+    /**
+     * @bug 8062518
+     * Verifies that a reference to the DTM created by XSLT document function is
+     * actually read from the DTM by an extension function.
+     * @param xml Content of xml file to process
+     * @param xsl stylesheet content that loads external document {@code externalDoc}
+     *        with XSLT 'document' function and then reads it with
+     *        DocumentExtFunc.test() function
+     * @param externalDoc Content of the external xml document
+     * @param expectedResult Expected transformation result
+     **/
+    @Test(dataProvider = "document")
+    public void testDocument(final String xml, final String xsl,
+                             final String externalDoc, final String expectedResult) throws Exception {
+        // Prepare sources for transormation
+        Source src = new StreamSource(new StringReader(xml));
+        Source xslsrc = new StreamSource(new StringReader(xsl));
+
+        // Create factory and transformer
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer t = tf.newTransformer( xslsrc );
+        t.setErrorListener(tf.getErrorListener());
+
+        // Set URI Resolver to return the newly constructed xml
+        // stream source object from xml test string
+        t.setURIResolver(new URIResolver() {
+            @Override
+            public Source resolve(String href, String base)
+                    throws TransformerException {
+                if (href.contains("externalDoc")) {
+                    return new StreamSource(new StringReader(externalDoc));
+                } else {
+                    return new StreamSource(new StringReader(xml));
+                }
+            }
+        });
+
+        // Prepare output stream
+        StringWriter xmlResultString = new StringWriter();
+        StreamResult xmlResultStream = new StreamResult(xmlResultString);
+
+        //Transform the xml
+        t.transform(src, xmlResultStream);
+
+        // If the document can't be accessed and the bug is in place then
+        // reported exception will be thrown during transformation
+        System.out.println("Transformation result:"+xmlResultString.toString().trim());
+
+        // Check the result - it should contain two (node name, node values) entries -
+        // one for original document, another for a document created with
+        // call to 'document' function
+        assertEquals(xmlResultString.toString().trim(), expectedResult);
+    }
+
+    @DataProvider(name = "document")
+    public static Object[][] documentTestData() {
+        return new Object[][] {
+            {documentTestXml, documentTestXsl, documentTestExternalDoc, documentTesteExpectedResult},
+        };
+    }
+
+    static final String documentTestXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Test>Doc</Test>";
+
+    static final String documentTestExternalDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Test>External Doc</Test>";
+
+    static final String documentTestXsl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+            + "<xsl:transform version=\"1.0\""
+            + " xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" "
+            + " xmlns:cfunc=\"http://xml.apache.org/xalan/java/\">"
+            + "<xsl:template match=\"/\">"
+            + "<xsl:element name=\"root\">"
+            + "<xsl:variable name=\"other_doc\" select=\"document(&#39;externalDoc&#39;)\"/>"
+            + "<!-- Source -->"
+            + "<xsl:value-of select=\"cfunc:javax.xml.transform.DocumentExtFunc.test(/Test)\"/>"
+            + "<!-- document() -->"
+            + "<xsl:value-of select=\"cfunc:javax.xml.transform.DocumentExtFunc.test($other_doc/Test)\"/>"
+            + "</xsl:element></xsl:template></xsl:transform>";
+
+    static final String documentTesteExpectedResult = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                                                    + "<root>[Test:Doc][Test:External Doc]</root>";
+}
--- a/jaxws/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/jaxws/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -309,3 +309,4 @@
 77f44848c44c003205490bf5ab88035233b65418 jdk9-b61
 cd0cf72b2cbf4adb778a02505fb065bb2292688c jdk9-b62
 b5c22d09b1c91dd49b006f38d8ba9c4397517ccc jdk9-b63
+df100399ed27d0eaa57c137ca99819a0fee66178 jdk9-b64
--- a/jdk/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -306,3 +306,4 @@
 da84dcac1b0b12c5b836b05ac75ecbfadee0cd32 jdk9-b61
 49118e68fbd4cc0044e718c47db681946d5efd69 jdk9-b62
 fd3281c400347088b36aeb16273aa679d53a81a4 jdk9-b63
+7de8d036ad0980d988d1b9b4b4e6be555d9fbf98 jdk9-b64
--- a/jdk/make/CompileDemos.gmk	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/make/CompileDemos.gmk	Tue May 19 11:40:00 2015 -0700
@@ -30,6 +30,7 @@
 include JavaCompilation.gmk
 include NativeCompilation.gmk
 include SetupJavaCompilers.gmk
+include TextFileProcessing.gmk
 
 # Prepare the find cache.
 $(eval $(call FillCacheFind, $(JDK_TOPDIR)/src))
@@ -49,6 +50,15 @@
 
 ##################################################################################################
 
+# This rule will be depended on due to the MANIFEST line
+$(eval $(call SetupTextFileProcessing, BUILD_JAVA_MANIFEST, \
+  SOURCE_FILES := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+  OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
+  REPLACEMENTS := \
+      @@RELEASE@@ => $(RELEASE) ; \
+      @@COMPANY_NAME@@ => $(COMPANY_NAME) , \
+))
+
 define SetupAppletDemo
   $$(eval $$(call SetupJavaCompilation,BUILD_DEMO_APPLET_$1, \
       SETUP := GENERATE_USINGJDKBYTECODE, \
@@ -122,7 +132,7 @@
         COPY := $(PATTERNS_TO_COPY) $(10), \
         JAR := $(SUPPORT_OUTPUTDIR)/demo/image/$2/$1/$$($1_JARFILE), \
         JARMAIN := $4, \
-        MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+        MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
         EXTRA_MANIFEST_ATTR := $(11), \
         SRCZIP := $(SUPPORT_OUTPUTDIR)/demo/image/$2/$1/src.zip, \
         EXCLUDE_FILES := $9, \
@@ -290,7 +300,7 @@
         COPY := $(PATTERNS_TO_COPY), \
         JAR := $(SUPPORT_OUTPUTDIR)/demo/image/jvmti/$1/$1.jar, \
         EXTRA_MANIFEST_ATTR := Main-Class: \n, \
-        MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf))
+        MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf))
 
     BUILD_DEMOS += $(SUPPORT_OUTPUTDIR)/demo/image/jvmti/$1/$1.jar
   endif
@@ -382,7 +392,7 @@
       BIN := $(SUPPORT_OUTPUTDIR)/demo/classes/jni/Poller, \
       HEADERS := $(SUPPORT_OUTPUTDIR)/demo/classes/jni/Poller, \
       JAR := $(SUPPORT_OUTPUTDIR)/demo/image/jni/Poller/Poller.jar, \
-      MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+      MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
       SRCZIP := $(SUPPORT_OUTPUTDIR)/demo/image/jni/Poller/src.zip, \
       COPY := README.txt Poller.c, \
       JARMAIN := Client))
--- a/jdk/src/java.base/share/classes/java/lang/Character.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Character.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -645,8 +645,14 @@
      * @since 1.2
      */
     public static final class UnicodeBlock extends Subset {
-
-        private static Map<String, UnicodeBlock> map = new HashMap<>(256);
+        /**
+         * 510  - the expected number of enteties
+         * 0.75 - the default load factor of HashMap
+         */
+        private static final int INITIAL_CAPACITY =
+                (int)(510 / 0.75f + 1.0f);
+        private static Map<String, UnicodeBlock> map =
+                new HashMap<>(INITIAL_CAPACITY);
 
         /**
          * Creates a UnicodeBlock with the given identifier name.
--- a/jdk/src/java.base/share/classes/java/lang/Long.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Long.java	Tue May 19 11:40:00 2015 -0700
@@ -1708,7 +1708,7 @@
      * @since 1.5
      */
      public static int bitCount(long i) {
-        // HD, Figure 5-14
+        // HD, Figure 5-2
         i = i - ((i >>> 1) & 0x5555555555555555L);
         i = (i & 0x3333333333333333L) + ((i >>> 2) & 0x3333333333333333L);
         i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
--- a/jdk/src/java.base/share/classes/java/lang/String.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/String.java	Tue May 19 11:40:00 2015 -0700
@@ -179,7 +179,7 @@
      * not affect the newly created string.
      *
      * @param  value
-         *         Array that is the source of characters
+     *         Array that is the source of characters
      *
      * @param  offset
      *         The initial offset
@@ -208,7 +208,7 @@
         if (offset > value.length - count) {
             throw new StringIndexOutOfBoundsException(offset + count);
         }
-        this.value = Arrays.copyOfRange(value, offset, offset+count);
+        this.value = Arrays.copyOfRange(value, offset, offset + count);
     }
 
     /**
@@ -262,11 +262,11 @@
         // Pass 1: Compute precise size of char[]
         int n = count;
         for (int i = offset; i < end; i++) {
-        int c = codePoints[i];
-        if (Character.isBmpCodePoint(c))
-            continue;
-        else if (Character.isValidCodePoint(c))
-            n++;
+            int c = codePoints[i];
+            if (Character.isBmpCodePoint(c))
+                continue;
+            else if (Character.isValidCodePoint(c))
+                n++;
             else throw new IllegalArgumentException(Integer.toString(c));
         }
 
@@ -327,7 +327,7 @@
     @Deprecated
     public String(byte ascii[], int hibyte, int offset, int count) {
         checkBounds(ascii, offset, count);
-        char value[] = new char[count];
+        char[] value = new char[count];
 
         if (hibyte == 0) {
             for (int i = count; i-- > 0;) {
@@ -465,7 +465,7 @@
         if (charset == null)
             throw new NullPointerException("charset");
         checkBounds(bytes, offset, length);
-        this.value =  StringCoding.decode(charset, bytes, offset, length);
+        this.value = StringCoding.decode(charset, bytes, offset, length);
     }
 
     /**
@@ -567,7 +567,7 @@
      *
      * @since  1.1
      */
-    public String(byte bytes[]) {
+    public String(byte[] bytes) {
         this(bytes, 0, bytes.length);
     }
 
@@ -983,11 +983,10 @@
             return true;
         }
         if (anObject instanceof String) {
-            String anotherString = (String)anObject;
-            int n = value.length;
-            if (n == anotherString.value.length) {
-                char v1[] = value;
-                char v2[] = anotherString.value;
+            char[] v1 = value;
+            char[] v2 = ((String)anObject).value;
+            int n = v1.length;
+            if (n == v2.length) {
                 int i = 0;
                 while (n-- != 0) {
                     if (v1[i] != v2[i])
@@ -1020,8 +1019,8 @@
     }
 
     private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
-        char v1[] = value;
-        char v2[] = sb.getValue();
+        char[] v1 = value;
+        char[] v2 = sb.getValue();
         int n = v1.length;
         if (n != sb.length()) {
             return false;
@@ -1066,7 +1065,7 @@
             return equals(cs);
         }
         // Argument is a generic CharSequence
-        char v1[] = value;
+        char[] v1 = value;
         int n = v1.length;
         if (n != cs.length()) {
             return false;
@@ -1156,20 +1155,18 @@
      *          lexicographically greater than the string argument.
      */
     public int compareTo(String anotherString) {
-        int len1 = value.length;
-        int len2 = anotherString.value.length;
+        char[] v1 = value;
+        char[] v2 = anotherString.value;
+        int len1 = v1.length;
+        int len2 = v2.length;
         int lim = Math.min(len1, len2);
-        char v1[] = value;
-        char v2[] = anotherString.value;
 
-        int k = 0;
-        while (k < lim) {
+        for (int k = 0; k < lim; k++) {
             char c1 = v1[k];
             char c2 = v2[k];
             if (c1 != c2) {
                 return c1 - c2;
             }
-            k++;
         }
         return len1 - len2;
     }
@@ -1278,14 +1275,14 @@
      */
     public boolean regionMatches(int toffset, String other, int ooffset,
             int len) {
-        char ta[] = value;
+        char[] ta = value;
         int to = toffset;
-        char pa[] = other.value;
+        char[] pa = other.value;
         int po = ooffset;
         // Note: toffset, ooffset, or len might be near -1>>>1.
         if ((ooffset < 0) || (toffset < 0)
-                || (toffset > (long)value.length - len)
-                || (ooffset > (long)other.value.length - len)) {
+                || (toffset > (long)ta.length - len)
+                || (ooffset > (long)pa.length - len)) {
             return false;
         }
         while (len-- > 0) {
@@ -1348,14 +1345,14 @@
      */
     public boolean regionMatches(boolean ignoreCase, int toffset,
             String other, int ooffset, int len) {
-        char ta[] = value;
+        char[] ta = value;
         int to = toffset;
-        char pa[] = other.value;
+        char[] pa = other.value;
         int po = ooffset;
         // Note: toffset, ooffset, or len might be near -1>>>1.
         if ((ooffset < 0) || (toffset < 0)
-                || (toffset > (long)value.length - len)
-                || (ooffset > (long)other.value.length - len)) {
+                || (toffset > (long)ta.length - len)
+                || (ooffset > (long)pa.length - len)) {
             return false;
         }
         while (len-- > 0) {
@@ -1405,13 +1402,13 @@
      *          </pre>
      */
     public boolean startsWith(String prefix, int toffset) {
-        char ta[] = value;
+        char[] ta = value;
         int to = toffset;
-        char pa[] = prefix.value;
+        char[] pa = prefix.value;
         int po = 0;
-        int pc = prefix.value.length;
+        int pc = pa.length;
         // Note: toffset might be near -1>>>1.
-        if ((toffset < 0) || (toffset > value.length - pc)) {
+        if ((toffset < 0) || (toffset > ta.length - pc)) {
             return false;
         }
         while (--pc >= 0) {
@@ -1473,7 +1470,9 @@
             for (char v : value) {
                 h = 31 * h + v;
             }
-            hash = h;
+            if (h != 0) {
+                hash = h;
+            }
         }
         return h;
     }
@@ -1928,14 +1927,17 @@
      *             length of this {@code String} object.
      */
     public String substring(int beginIndex) {
-        if (beginIndex < 0) {
-            throw new StringIndexOutOfBoundsException(beginIndex);
+        if (beginIndex <= 0) {
+            if (beginIndex < 0) {
+                throw new StringIndexOutOfBoundsException(beginIndex);
+            }
+            return this;
         }
         int subLen = value.length - beginIndex;
         if (subLen < 0) {
             throw new StringIndexOutOfBoundsException(subLen);
         }
-        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
+        return new String(value, beginIndex, subLen);
     }
 
     /**
@@ -1961,8 +1963,13 @@
      *             {@code endIndex}.
      */
     public String substring(int beginIndex, int endIndex) {
-        if (beginIndex < 0) {
-            throw new StringIndexOutOfBoundsException(beginIndex);
+        if (beginIndex <= 0) {
+            if (beginIndex < 0) {
+                throw new StringIndexOutOfBoundsException(beginIndex);
+            }
+            if (endIndex == value.length) {
+                return this;
+            }
         }
         if (endIndex > value.length) {
             throw new StringIndexOutOfBoundsException(endIndex);
@@ -1971,8 +1978,7 @@
         if (subLen < 0) {
             throw new StringIndexOutOfBoundsException(subLen);
         }
-        return ((beginIndex == 0) && (endIndex == value.length)) ? this
-                : new String(value, beginIndex, subLen);
+        return new String(value, beginIndex, subLen);
     }
 
     /**
@@ -2034,7 +2040,7 @@
             return this;
         }
         int len = value.length;
-        char buf[] = Arrays.copyOf(value, len + otherLen);
+        char[] buf = Arrays.copyOf(value, len + otherLen);
         str.getChars(buf, len);
         return new String(buf, true);
     }
@@ -2070,9 +2076,9 @@
      */
     public String replace(char oldChar, char newChar) {
         if (oldChar != newChar) {
-            int len = value.length;
+            char[] val = value; /* avoid getfield opcode */
+            int len = val.length;
             int i = -1;
-            char[] val = value; /* avoid getfield opcode */
 
             while (++i < len) {
                 if (val[i] == oldChar) {
@@ -2080,7 +2086,7 @@
                 }
             }
             if (i < len) {
-                char buf[] = new char[len];
+                char[] buf = new char[len];
                 for (int j = 0; j < i; j++) {
                     buf[j] = val[j];
                 }
@@ -2876,17 +2882,17 @@
      *          trailing white space.
      */
     public String trim() {
-        int len = value.length;
-        int st = 0;
         char[] val = value;    /* avoid getfield opcode */
+        int end = val.length;
+        int beg = 0;
 
-        while ((st < len) && (val[st] <= ' ')) {
-            st++;
+        while ((beg < end) && (val[beg] <= ' ')) {
+            beg++;
         }
-        while ((st < len) && (val[len - 1] <= ' ')) {
-            len--;
+        while ((beg < end) && (val[end - 1] <= ' ')) {
+            end--;
         }
-        return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
+        return substring(beg, end);
     }
 
     /**
@@ -3081,7 +3087,7 @@
      */
     public char[] toCharArray() {
         // Cannot use Arrays.copyOf because of class initialization order issues
-        char result[] = new char[value.length];
+        char[] result = new char[value.length];
         System.arraycopy(value, 0, result, 0, value.length);
         return result;
     }
@@ -3266,8 +3272,7 @@
      *          as its single character the argument {@code c}.
      */
     public static String valueOf(char c) {
-        char data[] = {c};
-        return new String(data, true);
+        return new String(new char[]{c}, true);
     }
 
     /**
--- a/jdk/src/java.base/share/classes/java/security/cert/LDAPCertStoreParameters.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/cert/LDAPCertStoreParameters.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,7 +30,12 @@
  * <p>
  * This class is used to provide necessary configuration parameters (server
  * name and port number) to implementations of the LDAP {@code CertStore}
- * algorithm.
+ * algorithm. However, if you are retrieving certificates or CRLs from
+ * an ldap URI as specified by RFC 5280, use the
+ * {@link java.security.cert.URICertStoreParameters URICertStoreParameters}
+ * instead as the URI may contain additional information such as the
+ * distinguished name that will help the LDAP CertStore find the specific
+ * certificates and CRLs.
  * <p>
  * <b>Concurrent Access</b>
  * <p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/security/cert/URICertStoreParameters.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  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 java.security.cert;
+
+import java.net.URI;
+
+/**
+ * Parameters used as input for {@code CertStore} algorithms which use
+ * information contained in a URI to retrieve certificates and CRLs.
+ * <p>
+ * This class is used to provide necessary configuration parameters
+ * through a URI as defined in RFC 5280 to implementations of
+ * {@code CertStore} algorithms.
+ * <p>
+ * <b>Concurrent Access</b>
+ * <p>
+ * Unless otherwise specified, the methods defined in this class are not
+ * thread-safe. Multiple threads that need to access a single
+ * object concurrently should synchronize amongst themselves and
+ * provide the necessary locking. Multiple threads each manipulating
+ * separate objects need not synchronize.
+ *
+ * @since       1.9
+ * @see         CertStore
+ * @see         java.net.URI
+ */
+public final class URICertStoreParameters implements CertStoreParameters {
+
+    /**
+     * The uri, cannot be null
+     */
+    private final URI uri;
+
+    /*
+     * Hash code for this parameters.
+     */
+    private int myhash = -1;
+
+    /**
+     * Creates an instance of {@code URICertStoreParameters} with the
+     * specified URI.
+     *
+     * @param uri the URI which contains configuration information.
+     * @throws NullPointerException if {@code uri} is null
+     */
+    public URICertStoreParameters(URI uri) {
+        if (uri == null) {
+            throw new NullPointerException();
+        }
+        this.uri = uri;
+    }
+
+    /**
+     * Returns the URI used to construct this
+     * {@code URICertStoreParameters} object.
+     *
+     * @return the URI.
+     */
+    public URI getURI() {
+        return uri;
+    }
+
+    /**
+     * Returns a copy of this object. Changes to the copy will not affect
+     * the original and vice versa.
+     *
+     * @return the copy
+     */
+    @Override
+    public URICertStoreParameters clone() {
+        try {
+            return new URICertStoreParameters(uri);
+        } catch (NullPointerException e) {
+            /* Cannot happen */
+            throw new InternalError(e.toString(), e);
+        }
+    }
+
+    /**
+     * Returns a hash code value for this parameters object.
+     * The hash code is generated using the URI supplied at construction.
+     *
+     * @return a hash code value for this parameters.
+     */
+    @Override
+    public int hashCode() {
+        if (myhash == -1) {
+            myhash = uri.hashCode()*7;
+        }
+        return myhash;
+    }
+
+    /**
+     * Compares the specified object with this parameters object for equality.
+     * Two URICertStoreParameters are considered equal if the URIs used
+     * to construct them are equal.
+     *
+     * @param p the object to test for equality with this parameters.
+     *
+     * @return true if the specified object is equal to this parameters object.
+     */
+    @Override
+    public boolean equals(Object p) {
+        if (p == null || (!(p instanceof URICertStoreParameters))) {
+            return false;
+        }
+
+        if (p == this) {
+            return true;
+        }
+
+        URICertStoreParameters other = (URICertStoreParameters)p;
+        return uri.equals(other.getURI());
+    }
+
+    /**
+     * Returns a formatted string describing the parameters
+     * including the URI used to construct this object.
+     *
+     * @return a formatted string describing the parameters
+     */
+    @Override
+    public String toString() {
+        return "URICertStoreParameters: " + uri.toString();
+    }
+}
--- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java	Tue May 19 11:40:00 2015 -0700
@@ -490,7 +490,7 @@
     }
 
     /**
-     * Equality comparision between two
+     * Equality comparison between two
      */
     public boolean equals(Object obj) {
         if (obj == null) return false;
--- a/jdk/src/java.base/share/classes/java/util/ArrayPrefixHelpers.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/ArrayPrefixHelpers.java	Tue May 19 11:40:00 2015 -0700
@@ -85,7 +85,7 @@
      *
      * As usual for this sort of utility, there are 4 versions, that
      * are simple copy/paste/adapt variants of each other.  (The
-     * double and int versions differ from long version soley by
+     * double and int versions differ from long version solely by
      * replacing "long" (with case-matching)).
      */
 
--- a/jdk/src/java.base/share/classes/java/util/Calendar.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Calendar.java	Tue May 19 11:40:00 2015 -0700
@@ -1172,7 +1172,7 @@
          * {@code fieldValuePairs} that are pairs of a field and its value.
          * For example,
          * <pre>
-         *   setFeilds(Calendar.YEAR, 2013,
+         *   setFields(Calendar.YEAR, 2013,
          *             Calendar.MONTH, Calendar.DECEMBER,
          *             Calendar.DAY_OF_MONTH, 23);</pre>
          * is equivalent to the sequence of the following
@@ -1298,7 +1298,7 @@
 
         /**
          * Sets the time zone parameter to the given {@code zone}. If no time
-         * zone parameter is given to this {@code Caledar.Builder}, the
+         * zone parameter is given to this {@code Calendar.Builder}, the
          * {@linkplain TimeZone#getDefault() default
          * <code>TimeZone</code>} will be used in the {@link #build() build}
          * method.
@@ -3316,7 +3316,7 @@
      * @param field the calendar field
      * @return the calendar field name
      * @exception IndexOutOfBoundsException if <code>field</code> is negative,
-     * equal to or greater then <code>FIELD_COUNT</code>.
+     * equal to or greater than {@code FIELD_COUNT}.
      */
     static String getFieldName(int field) {
         return FIELD_NAME[field];
--- a/jdk/src/java.base/share/classes/java/util/Collection.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Collection.java	Tue May 19 11:40:00 2015 -0700
@@ -537,7 +537,7 @@
      * @implSpec
      * The default implementation creates a
      * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
-     * from the collections's {@code Iterator}.  The spliterator inherits the
+     * from the collection's {@code Iterator}.  The spliterator inherits the
      * <em>fail-fast</em> properties of the collection's iterator.
      * <p>
      * The created {@code Spliterator} reports {@link Spliterator#SIZED}.
--- a/jdk/src/java.base/share/classes/java/util/Locale.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Locale.java	Tue May 19 11:40:00 2015 -0700
@@ -719,7 +719,7 @@
      * created and cached.
      *
      * @param language lowercase 2 to 8 language code.
-     * @param country uppercase two-letter ISO-3166 code and numric-3 UN M.49 area code.
+     * @param country uppercase two-letter ISO-3166 code and numeric-3 UN M.49 area code.
      * @param variant vendor and browser specific code. See class description.
      * @return the <code>Locale</code> instance requested
      * @exception NullPointerException if any argument is null.
@@ -1236,7 +1236,7 @@
     /**
      * Package private method returning the Locale's LocaleExtensions,
      * used by ResourceBundle.
-     * @return locale exnteions of this Locale,
+     * @return locale extensions of this Locale,
      *         or {@code null} if no extensions are defined
      */
      LocaleExtensions getLocaleExtensions() {
@@ -2609,7 +2609,7 @@
          * href="./Locale.html#def_locale_extension">well-formed</a> or an exception
          * is thrown.
          *
-         * <p>Attribute comparision for removal is case-insensitive.
+         * <p>Attribute comparison for removal is case-insensitive.
          *
          * @param attribute the attribute
          * @return This builder.
--- a/jdk/src/java.base/share/classes/java/util/TimeZone.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/TimeZone.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -293,6 +293,7 @@
             throw new NullPointerException();
         }
         this.ID = ID;
+        this.zoneId = null;   // invalidate cache
     }
 
     /**
@@ -544,7 +545,23 @@
      * @since 1.8
      */
     public ZoneId toZoneId() {
+        ZoneId zId = zoneId;
+        if (zId == null) {
+            zoneId = zId = toZoneId0();
+        }
+        return zId;
+    }
+
+    private ZoneId toZoneId0() {
         String id = getID();
+        TimeZone defaultZone = defaultTimeZone;
+        // are we not defaultTimeZone but our id is equal to default's?
+        if (defaultZone != this &&
+            defaultZone != null && id.equals(defaultZone.getID())) {
+            // delegate to default TZ which is effectively immutable
+            return defaultZone.toZoneId();
+        }
+        // derive it ourselves
         if (ZoneInfoFile.useOldMapping() && id.length() == 3) {
             if ("EST".equals(id))
                 return ZoneId.of("America/New_York");
@@ -710,7 +727,12 @@
             sm.checkPermission(new PropertyPermission
                                ("user.timezone", "write"));
         }
-        defaultTimeZone = zone;
+        // by saving a defensive clone and returning a clone in getDefault() too,
+        // the defaultTimeZone instance is isolated from user code which makes it
+        // effectively immutable. This is important to avoid races when the
+        // following is evaluated in ZoneId.systemDefault():
+        // TimeZone.getDefault().toZoneId().
+        defaultTimeZone = (zone == null) ? null : (TimeZone) zone.clone();
     }
 
     /**
@@ -735,9 +757,7 @@
     public Object clone()
     {
         try {
-            TimeZone other = (TimeZone) super.clone();
-            other.ID = ID;
-            return other;
+            return super.clone();
         } catch (CloneNotSupportedException e) {
             throw new InternalError(e);
         }
@@ -759,6 +779,12 @@
      * @serial
      */
     private String           ID;
+
+    /**
+     * Cached {@link ZoneId} for this TimeZone
+     */
+    private transient ZoneId zoneId;
+
     private static volatile TimeZone defaultTimeZone;
 
     static final String         GMT_ID        = "GMT";
--- a/jdk/src/java.base/share/classes/java/util/TreeMap.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/TreeMap.java	Tue May 19 11:40:00 2015 -0700
@@ -859,7 +859,7 @@
      * Returns a {@link Set} view of the mappings contained in this map.
      *
      * <p>The set's iterator returns the entries in ascending key order. The
-     * sets's spliterator is
+     * set's spliterator is
      * <em><a href="Spliterator.html#binding">late-binding</a></em>,
      * <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED} and
      * {@link Spliterator#ORDERED} with an encounter order that is ascending key
@@ -2643,7 +2643,7 @@
      * child, also serving as origin for the split-off spliterator.
      * Left-hands are symmetric. Descending versions place the origin
      * at the end and invert ascending split rules.  This base class
-     * is non-commital about directionality, or whether the top-level
+     * is non-committal about directionality, or whether the top-level
      * spliterator covers the whole tree. This means that the actual
      * split mechanics are located in subclasses. Some of the subclass
      * trySplit methods are identical (except for return types), but
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java	Tue May 19 11:40:00 2015 -0700
@@ -481,7 +481,7 @@
      *
      * Maintaining API and serialization compatibility with previous
      * versions of this class introduces several oddities. Mainly: We
-     * leave untouched but unused constructor arguments refering to
+     * leave untouched but unused constructor arguments referring to
      * concurrencyLevel. We accept a loadFactor constructor argument,
      * but apply it only to initial table capacity (which is the only
      * time that we can guarantee to honor it.) We also declare an
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java	Tue May 19 11:40:00 2015 -0700
@@ -2710,7 +2710,7 @@
         }
 
         /**
-         * Returns lowest absolute key (ignoring directonality).
+         * Returns lowest absolute key (ignoring directionality).
          */
         K lowestKey() {
             Comparator<? super K> cmp = m.comparator;
@@ -2722,7 +2722,7 @@
         }
 
         /**
-         * Returns highest absolute key (ignoring directonality).
+         * Returns highest absolute key (ignoring directionality).
          */
         K highestKey() {
             Comparator<? super K> cmp = m.comparator;
--- a/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/Parser.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/Parser.java	Tue May 19 11:40:00 2015 -0700
@@ -145,12 +145,12 @@
     /**
      * ASCII character type array.
      *
-     * This array maps an ASCII (7 bit) character to the character type.<br />
-     * Possible character type values are:<br /> - ' ' for any kind of white
-     * space character;<br /> - 'a' for any lower case alphabetical character
-     * value;<br /> - 'A' for any upper case alphabetical character value;<br />
-     * - 'd' for any decimal digit character value;<br /> - 'z' for any
-     * character less then ' ' except '\t', '\n', '\r';<br /> An ASCII (7 bit)
+     * This array maps an ASCII (7 bit) character to the character type.<br>
+     * Possible character type values are:<br> - ' ' for any kind of white
+     * space character;<br> - 'a' for any lower case alphabetical character
+     * value;<br> - 'A' for any upper case alphabetical character value;<br>
+     * - 'd' for any decimal digit character value;<br> - 'z' for any
+     * character less than ' ' except '\t', '\n', '\r';<br> An ASCII (7 bit)
      * character which does not fall in any category listed above is mapped to
      * it self.
      */
@@ -158,11 +158,11 @@
     /**
      * NMTOKEN character type array.
      *
-     * This array maps an ASCII (7 bit) character to the character type.<br />
-     * Possible character type values are:<br /> - 0 for underscore ('_') or any
-     * lower and upper case alphabetical character value;<br /> - 1 for colon
-     * (':') character;<br /> - 2 for dash ('-') and dot ('.') or any decimal
-     * digit character value;<br /> - 3 for any kind of white space character<br
+     * This array maps an ASCII (7 bit) character to the character type.<br>
+     * Possible character type values are:<br> - 0 for underscore ('_') or any
+     * lower and upper case alphabetical character value;<br> - 1 for colon
+     * (':') character;<br> - 2 for dash ('-') and dot ('.') or any decimal
+     * digit character value;<br> - 3 for any kind of white space character<br
      * /> An ASCII (7 bit) character which does not fall in any category listed
      * above is mapped to 0xff.
      */
@@ -1841,10 +1841,12 @@
     /**
      * Reads an attribute value.
      *
-     * The grammar which this method can read is:<br />
-     * <code>eqstr := S &quot;=&quot; qstr</code><br />
-     * <code>qstr  := S (&quot;'&quot; string &quot;'&quot;) |
-     *  ('&quot;' string '&quot;')</code><br /> This method resolves entities
+     * The grammar this method can read is:
+     * <pre>{@code
+     * eqstr := S "=" qstr
+     * qstr  := S ("'" string "'") | ('"' string '"')
+     * }</pre>
+     * This method resolves entities
      * inside a string unless the parser parses DTD.
      *
      * @param flag The '=' character forces the method to accept the '='
@@ -2633,7 +2635,7 @@
      * Reports characters and empties the parser's buffer. This method is called
      * only if parser is going to return control to the main loop. This means
      * that this method may use parser buffer to report white space without
-     * copeing characters to temporary buffer.
+     * copying characters to temporary buffer.
      */
     protected abstract void bflash()
             throws Exception;
@@ -2642,7 +2644,7 @@
      * Reports white space characters and empties the parser's buffer. This
      * method is called only if parser is going to return control to the main
      * loop. This means that this method may use parser buffer to report white
-     * space without copeing characters to temporary buffer.
+     * space without copying characters to temporary buffer.
      */
     protected abstract void bflash_ws()
             throws Exception;
@@ -3290,16 +3292,20 @@
     }
 
     /**
-     * Maps a character to it's type.
+     * Maps a character to its type.
      *
-     * Possible character type values are:<br /> - ' ' for any kind of white
-     * space character;<br /> - 'a' for any lower case alphabetical character
-     * value;<br /> - 'A' for any upper case alphabetical character value;<br />
-     * - 'd' for any decimal digit character value;<br /> - 'z' for any
-     * character less then ' ' except '\t', '\n', '\r';<br /> - 'X' for any not
-     * ASCII character;<br /> - 'Z' for EOS character.<br /> An ASCII (7 bit)
-     * character which does not fall in any category listed above is mapped to
-     * it self.
+     * Possible character type values are:
+     * <ul>
+     * <li>' ' - for any kind of whitespace character;</li>
+     * <li>'a' - for any lower case alphabetical character value;</li>
+     * <li>'A' - for any upper case alphabetical character value;</li>
+     * <li>'d' - for any decimal digit character value;</li>
+     * <li>'z' - for any character less than ' ' except '\t', '\n', '\r';</li>
+     * <li>'X' - for any not ASCII character;</li>
+     * <li>'Z' - for EOS character.</li>
+     * </ul>
+     * An ASCII (7 bit) character which does not fall in any category
+     * listed above is mapped to itself.
      *
      * @param ch The character to map.
      * @return The type of character.
--- a/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/ParserSAX.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/ParserSAX.java	Tue May 19 11:40:00 2015 -0700
@@ -649,7 +649,7 @@
      * Reports characters and empties the parser's buffer. This method is called
      * only if parser is going to return control to the main loop. This means
      * that this method may use parser buffer to report white space without
-     * copeing characters to temporary buffer.
+     * copying characters to temporary buffer.
      */
     protected void bflash() throws SAXException {
         if (mBuffIdx >= 0) {
@@ -663,7 +663,7 @@
      * Reports white space characters and empties the parser's buffer. This
      * method is called only if parser is going to return control to the main
      * loop. This means that this method may use parser buffer to report white
-     * space without copeing characters to temporary buffer.
+     * space without copying characters to temporary buffer.
      */
     protected void bflash_ws() throws SAXException {
         if (mBuffIdx >= 0) {
--- a/jdk/src/java.base/share/classes/sun/misc/Cache.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Cache.java	Tue May 19 11:40:00 2015 -0700
@@ -196,8 +196,8 @@
     /**
      * Gets the object associated with the specified key in the Cache.
      * @param key the key in the hash table
-     * @returns the element for the key or null if the key
-     *          is not defined in the hash table.
+     * @return the element for the key or null if the key
+     *         is not defined in the hash table.
      * @see Cache#put
      */
     public synchronized Object get(Object key) {
--- a/jdk/src/java.base/share/classes/sun/misc/CharacterDecoder.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/CharacterDecoder.java	Tue May 19 11:40:00 2015 -0700
@@ -120,7 +120,7 @@
     /**
      * This method does an actual decode. It takes the decoded bytes and
      * writes them to the OutputStream. The integer <i>l</i> tells the
-     * method how many bytes are required. This is always <= bytesPerAtom().
+     * method how many bytes are required. This is always {@literal <=} bytesPerAtom().
      */
     protected void decodeAtom(PushbackInputStream aStream, OutputStream bStream, int l) throws IOException {
         throw new CEStreamExhausted();
--- a/jdk/src/java.base/share/classes/sun/misc/CharacterEncoder.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/CharacterEncoder.java	Tue May 19 11:40:00 2015 -0700
@@ -68,7 +68,7 @@
  * referenced in the See Also list below.
  *
  * @author      Chuck McManis
- * @see         CharacterDecoder;
+ * @see         CharacterDecoder
  * @see         UCEncoder
  * @see         UUEncoder
  * @see         BASE64Encoder
@@ -107,7 +107,7 @@
 
     /**
      * Encode the suffix that ends every output line. By default
-     * this method just prints a <newline> into the output stream.
+     * this method just prints a newline into the output stream.
      */
     protected void encodeLineSuffix(OutputStream aStream) throws IOException {
         pStream.println();
--- a/jdk/src/java.base/share/classes/sun/misc/ConditionLock.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/ConditionLock.java	Tue May 19 11:40:00 2015 -0700
@@ -34,7 +34,7 @@
  * with the lock() and unlock() methods. However if there is a thread
  * waiting for the state variable to become a particular value and you
  * simply call Unlock(), that thread will not be able to acquire the
- * lock until the state variable equals its desired value. <p>
+ * lock until the state variable equals its desired value.
  *
  * @author      Peter King
  */
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java	Tue May 19 11:40:00 2015 -0700
@@ -45,26 +45,26 @@
 import sun.net.www.ParseUtil;
 
 /**
- * <p>
  * This class checks dependent extensions a particular jar file may have
  * declared through its manifest attributes.
- * </p>
+ * <p>
  * Jar file declared dependent extensions through the extension-list
  * attribute. The extension-list contains a list of keys used to
  * fetch the other attributes describing the required extension.
  * If key is the extension key declared in the extension-list
  * attribute, the following describing attribute can be found in
- * the manifest :
- * key-Extension-Name:  (Specification package name)
- * key-Specification-Version: (Specification-Version)
- * key-Implementation-Version: (Implementation-Version)
- * key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)
- * key-Implementation-Version: (Implementation version)
- * key-Implementation-URL: (URL to download the requested extension)
+ * the manifest:
+ * <ul>
+ * <li>key-Extension-Name:  (Specification package name)</li>
+ * <li>key-Specification-Version: (Specification-Version)</li>
+ * <li>key-Implementation-Version: (Implementation-Version)</li>
+ * <li>key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)</li>
+ * <li>key-Implementation-Version: (Implementation version)</li>
+ * <li>key-Implementation-URL: (URL to download the requested extension)</li>
+ * </ul>
  * <p>
  * This class also maintain versioning consistency of installed
  * extensions dependencies declared in jar file manifest.
- * </p>
  *
  * @deprecated this class will be removed in a future release.
  * @author  Jerome Dochez
@@ -76,10 +76,9 @@
     private static Vector<ExtensionInstallationProvider> providers;
 
     /**
-     * <p>
      * Register an ExtensionInstallationProvider. The provider is responsible
      * for handling the installation (upgrade) of any missing extensions.
-     * </p>
+     *
      * @param eip ExtensionInstallationProvider implementation
      */
     public synchronized static void addExtensionInstallationProvider
@@ -92,9 +91,7 @@
     }
 
     /**
-     * <p>
      * Unregister a previously installed installation provider
-     * </p>
      */
     public synchronized static void removeExtensionInstallationProvider
         (ExtensionInstallationProvider eip)
@@ -103,10 +100,9 @@
     }
 
     /**
-     * <p>
      * Checks the dependencies of the jar file on installed extension.
-     * </p>
-     * @param jarFile containing the attriutes declaring the dependencies
+     *
+     * @param jar containing the attributes declaring the dependencies
      */
     public static boolean checkExtensionsDependencies(JarFile jar)
     {
@@ -182,9 +178,8 @@
 
 
     /*
-     * <p>
      * Check that a particular dependency on an extension is satisfied.
-     * </p>
+     *
      * @param extensionName is the key used for the attributes in the manifest
      * @param attr is the attributes of the manifest file
      *
@@ -204,10 +199,9 @@
     }
 
     /*
-     * <p>
      * Check if a particular extension is part of the currently installed
      * extensions.
-     * </p>
+     *
      * @param extensionName is the key for the attributes in the manifest
      * @param attr is the attributes of the manifest
      *
@@ -262,11 +256,9 @@
     }
 
     /*
-     * <p>
      * Check if the requested extension described by the attributes
      * in the manifest under the key extensionName is compatible with
      * the jar file.
-     * </p>
      *
      * @param extensionName key in the attribute list
      * @param attr manifest file attributes
@@ -337,10 +329,8 @@
     }
 
     /*
-     * <p>
      * An required extension is missing, if an ExtensionInstallationProvider is
      * registered, delegate the installation of that particular extension to it.
-     * </p>
      *
      * @param reqInfo Missing extension information
      * @param instInfo Older installed version information
@@ -380,11 +370,9 @@
     }
 
     /**
-     * <p>
      * Checks if the extension, that is specified in the extension-list in
      * the applet jar manifest, is already installed (i.e. exists in the
      * extension directory).
-     * </p>
      *
      * @param extensionName extension name in the extension-list
      *
@@ -428,9 +416,7 @@
     }
 
     /**
-     * <p>
      * @return the java.ext.dirs property as a list of directory
-     * </p>
      */
     private static File[] getExtDirs() {
         String s = java.security.AccessController.doPrivileged(
@@ -456,9 +442,8 @@
     }
 
     /*
-     * <p>
      * Scan the directories and return all files installed in those
-     * </p>
+     *
      * @param dirs list of directories to scan
      *
      * @return the list of files installed in all the directories
@@ -483,9 +468,7 @@
     }
 
     /*
-     * <p>
      * @return the list of installed extensions jar files
-     * </p>
      */
     private File[] getInstalledExtensions() throws IOException {
         return AccessController.doPrivileged(
@@ -503,9 +486,7 @@
     }
 
     /*
-     * <p>
      * Add the newly installed jar file to the extension class loader.
-     * </p>
      *
      * @param cl the current installed extension class loader
      *
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java	Tue May 19 11:40:00 2015 -0700
@@ -45,9 +45,7 @@
 public class ExtensionInfo {
 
     /**
-     * <p>
      * public static values returned by the isCompatible method
-     * </p>
      */
     public static final int COMPATIBLE = 0;
     public static final int REQUIRE_SPECIFICATION_UPGRADE = 1;
@@ -56,10 +54,8 @@
     public static final int INCOMPATIBLE = 4;
 
     /**
-     * <p>
      * attributes fully describer an extension. The underlying described
      * extension may be installed and requested.
-     * <p>
      */
     public String title;
     public String name;
@@ -76,15 +72,12 @@
 
 
     /**
-     * <p>
      * Create a new uninitialized extension information object
-     * </p>
      */
     public ExtensionInfo() {
     }
 
     /**
-     * <p>
      * Create and initialize an extension information object.
      * The initialization uses the attributes passed as being
      * the content of a manifest file to load the extension
@@ -93,7 +86,7 @@
      * extension they may depend on, the extension key parameter
      * is prepanded to the attribute name to make the key used
      * to retrieve the attribute from the manifest file
-     * <p>
+     *
      * @param extensionKey unique extension key in the manifest
      * @param attr Attributes of a manifest file
      */
@@ -149,13 +142,11 @@
     }
 
     /**
-     * <p>
      * @return true if the extension described by this extension information
      * is compatible with the extension described by the extension
      * information passed as a parameter
-     * </p>
      *
-     * @param the requested extension information to compare to
+     * @param ei the requested extension information to compare to
      */
     public int isCompatibleWith(ExtensionInfo ei) {
 
@@ -204,10 +195,8 @@
     }
 
     /**
-     * <p>
      * helper method to print sensible information on the undelying described
      * extension
-     * </p>
      */
     public String toString() {
         return "Extension : title(" + title + "), name(" + name + "), spec vendor(" +
@@ -217,15 +206,15 @@
     }
 
     /*
-     * <p>
      * helper method to compare two versions.
      * version are in the x.y.z.t pattern.
-     * </p>
+     *
      * @param source version to compare to
      * @param target version used to compare against
-     * @return < 0 if source < version
-     *         > 0 if source > version
-     *         = 0 if source = version
+     * @return <pre>{@code
+     *   < 0 if source < version
+     *   > 0 if source > version
+     *   = 0 if source = version}</pre>
      */
     private int compareExtensionVersion(String source, String target)
         throws NumberFormatException
@@ -238,15 +227,15 @@
 
 
     /*
-     * <p>
      * helper method to compare two versions.
      * version are in the x.y.z.t pattern.
-     * </p>
+     *
      * @param source version to compare to
      * @param target version used to compare against
-     * @return < 0 if source < version
-     *         > 0 if source > version
-     *         = 0 if source = version
+     * @return <pre>{@code
+     *   < 0 if source < version
+     *   > 0 if source > version
+     *   = 0 if source = version}</pre>
      */
     private int strictCompareExtensionVersion(String source, String target)
         throws NumberFormatException
--- a/jdk/src/java.base/share/classes/sun/misc/FDBigInteger.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/FDBigInteger.java	Tue May 19 11:40:00 2015 -0700
@@ -384,8 +384,8 @@
      * Retrieves the normalization bias of the <code>FDBigIntger</code>. The
      * normalization bias is a left shift such that after it the highest word
      * of the value will have the 4 highest bits equal to zero:
-     * <code>(highestWord & 0xf0000000) == 0</code>, but the next bit should be 1
-     * <code>(highestWord & 0x08000000) != 0</code>.
+     * {@code (highestWord & 0xf0000000) == 0}, but the next bit should be 1
+     * {@code (highestWord & 0x08000000) != 0}.
      *
      * @return The normalization bias.
      */
@@ -546,9 +546,9 @@
      * We assume that S has been normalized, as above, and that
      * "this" has been left-shifted accordingly.
      * Also assumed, of course, is that the result, q, can be expressed
-     * as an integer, 0 <= q < 10.
+     * as an integer, {@code 0 <= q < 10}.
      *
-     * @param The divisor of this <code>FDBigInteger</code>.
+     * @param S The divisor of this <code>FDBigInteger</code>.
      * @return <code>q = (int)(this / S)</code>.
      */
     /*@
@@ -685,7 +685,7 @@
      *
      * @param p5 The exponent of the power-of-five factor.
      * @param p2 The exponent of the power-of-two factor.
-     * @return
+     * @return The multiplication result.
      */
     /*@
      @ requires this.value() == 0 || p5 == 0 && p2 == 0;
@@ -931,11 +931,11 @@
     /**
      * Compares the parameter with this <code>FDBigInteger</code>. Returns an
      * integer accordingly as:
-     * <pre>
-     * >0: this > other
-     *  0: this == other
-     * <0: this < other
-     * </pre>
+     * <pre>{@code
+     * > 0: this > other
+     *   0: this == other
+     * < 0: this < other
+     * }</pre>
      *
      * @param other The <code>FDBigInteger</code> to compare.
      * @return A negative value, zero, or a positive value according to the
@@ -974,11 +974,11 @@
      * Compares this <code>FDBigInteger</code> with
      * <code>5<sup>p5</sup> * 2<sup>p2</sup></code>.
      * Returns an integer accordingly as:
-     * <pre>
-     * >0: this > other
-     *  0: this == other
-     * <0: this < other
-     * </pre>
+     * <pre>{@code
+     * > 0: this > other
+     *   0: this == other
+     * < 0: this < other
+     * }</pre>
      * @param p5 The exponent of the power-of-five factor.
      * @param p2 The exponent of the power-of-two factor.
      * @return A negative value, zero, or a positive value according to the
@@ -1011,11 +1011,11 @@
     /**
      * Compares this <code>FDBigInteger</code> with <code>x + y</code>. Returns a
      * value according to the comparison as:
-     * <pre>
+     * <pre>{@code
      * -1: this <  x + y
      *  0: this == x + y
      *  1: this >  x + y
-     * </pre>
+     * }</pre>
      * @param x The first addend of the sum to compare.
      * @param y The second addend of the sum to compare.
      * @return -1, 0, or 1 according to the result of the comparison.
--- a/jdk/src/java.base/share/classes/sun/misc/FloatingDecimal.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/FloatingDecimal.java	Tue May 19 11:40:00 2015 -0700
@@ -154,7 +154,7 @@
 
         /**
          * Indicates the sign of the value.
-         * @return <code>value < 0.0</code>.
+         * @return {@code value < 0.0}.
          */
         public boolean isNegative();
 
--- a/jdk/src/java.base/share/classes/sun/misc/IOUtils.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/IOUtils.java	Tue May 19 11:40:00 2015 -0700
@@ -39,7 +39,7 @@
     /**
      * Read up to <code>length</code> of bytes from <code>in</code>
      * until EOF is detected.
-     * @param in input stream, must not be null
+     * @param is input stream, must not be null
      * @param length number of bytes to read, -1 or Integer.MAX_VALUE means
      *        read as much as possible
      * @param readAll if true, an EOFException will be thrown if not enough
--- a/jdk/src/java.base/share/classes/sun/misc/JarFilter.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/JarFilter.java	Tue May 19 11:40:00 2015 -0700
@@ -29,10 +29,8 @@
 import java.io.FilenameFilter;
 
 /**
- * <p>
  * This class checks that only jar and zip files are included in the file list.
  * This class is used in extension installation support (ExtensionDependency).
- * <p>
  *
  * @deprecated this class will be removed in a future release.
  * @author  Michael Colburn
--- a/jdk/src/java.base/share/classes/sun/misc/JavaLangAccess.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/JavaLangAccess.java	Tue May 19 11:40:00 2015 -0700
@@ -91,14 +91,14 @@
      * may be added to the delete on exit list by the application shutdown
      * hooks.
      *
-     * @params slot  the slot in the shutdown hook array, whose element
-     *               will be invoked in order during shutdown
-     * @params registerShutdownInProgress true to allow the hook
-     *               to be registered even if the shutdown is in progress.
-     * @params hook  the hook to be registered
+     * @param slot  the slot in the shutdown hook array, whose element
+     *              will be invoked in order during shutdown
+     * @param registerShutdownInProgress true to allow the hook
+     *        to be registered even if the shutdown is in progress.
+     * @param hook  the hook to be registered
      *
-     * @throw IllegalStateException if shutdown is in progress and
-     *          the slot is not valid to register.
+     * @throws IllegalStateException if shutdown is in progress and
+     *         the slot is not valid to register.
      */
     void registerShutdownHook(int slot, boolean registerShutdownInProgress, Runnable hook);
 
--- a/jdk/src/java.base/share/classes/sun/misc/Perf.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Perf.java	Tue May 19 11:40:00 2015 -0700
@@ -67,13 +67,13 @@
      * <code>AccessController.doPrivileged(PrivilegedAction)</code>.
      * <p> Here is a suggested idiom for use of this class:
      *
-     * <blockquote><pre>
+     * <blockquote><pre>{@code
      * class MyTrustedClass {
      *   private static final Perf perf =
      *       AccessController.doPrivileged(new Perf.GetPerfAction<Perf>());
      *   ...
      * }
-     * </pre></blockquote>
+     * }</pre></blockquote>
      * <p>
      * In the presence of a security manager, the <code>MyTrustedClass</code>
      * class in the above example will need to be granted the
@@ -171,8 +171,7 @@
      * The attach mode specifies the access permissions requested for the
      * instrumentation buffer of the target virtual machine. The permitted
      * access permissions are:
-     * <p>
-     * <bl>
+     * <ul>
      * <li>"r"  - Read only access. This Java virtual machine has only
      * read access to the instrumentation buffer for the target Java
      * virtual machine.
@@ -180,7 +179,7 @@
      * write access to the instrumentation buffer for the target Java virtual
      * machine. This mode is currently not supported and is reserved for
      * future enhancements.
-     * </bl>
+     * </ul>
      *
      * @param   lvmid            an integer that uniquely identifies the
      *                           target local Java virtual machine.
--- a/jdk/src/java.base/share/classes/sun/misc/PerfCounter.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/PerfCounter.java	Tue May 19 11:40:00 2015 -0700
@@ -37,7 +37,7 @@
  * The perf counters will be created in the jvmstat perf buffer
  * that the HotSpot VM creates. The default size is 32K and thus
  * the number of counters is bounded.  You can alter the size
- * with -XX:PerfDataMemorySize=<bytes> option. If there is
+ * with {@code -XX:PerfDataMemorySize=<bytes>} option. If there is
  * insufficient memory in the jvmstat perf buffer, the C heap memory
  * will be used and thus the application will continue to run if
  * the counters added exceeds the buffer size but the counters
--- a/jdk/src/java.base/share/classes/sun/misc/PerformanceLogger.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/PerformanceLogger.java	Tue May 19 11:40:00 2015 -0700
@@ -51,10 +51,12 @@
  * <P>
  * To automatically track startup performance in an app or applet,
  * use the command-line parameter sun.perflog as follows:<BR>
+ * <pre>{@code
  *     -Dsun.perflog[=file:<filename>]
+ * }</pre>
  * <BR>
  * where simply using the parameter with no value will enable output
- * to the console and a value of "file:<filename>" will cause
+ * to the console and a value of "{@code file:<filename>}" will cause
  * that given filename to be created and used for all output.
  * <P>
  * By default, times are measured using System.currentTimeMillis().  To use
--- a/jdk/src/java.base/share/classes/sun/misc/Resource.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Resource.java	Tue May 19 11:40:00 2015 -0700
@@ -154,7 +154,8 @@
 
     /**
      * Returns the Resource data as a ByteBuffer, but only if the input stream
-     * was implemented on top of a ByteBuffer. Return <tt>null</tt> otherwise.
+     * was implemented on top of a ByteBuffer. Return {@code null} otherwise.
+     * @return Resource data or null.
      */
     public ByteBuffer getByteBuffer() throws IOException {
         InputStream in = cachedInputStream();
--- a/jdk/src/java.base/share/classes/sun/misc/Signal.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Signal.java	Tue May 19 11:40:00 2015 -0700
@@ -50,7 +50,7 @@
  * Signal objects are created based on their names. For example:
  * <blockquote><pre>
  * new Signal("INT");
- * </blockquote></pre>
+ * </pre></blockquote>
  * constructs a signal object corresponding to <code>SIGINT</code>, which is
  * typically produced when the user presses <code>Ctrl-C</code> at the command line.
  * The <code>Signal</code> constructor throws <code>IllegalArgumentException</code>
@@ -64,7 +64,7 @@
  *     }
  * };
  * Signal.handle(new Signal("INT"), handler);
- * </blockquote></pre>
+ * </pre></blockquote>
  *
  * @author   Sheng Liang
  * @author   Bill Shannon
@@ -149,7 +149,7 @@
      *
      * @param sig a signal
      * @param handler the handler to be registered with the given signal.
-     * @result the old handler
+     * @return the old handler
      * @exception IllegalArgumentException the signal is in use by the VM
      * @see sun.misc.Signal#raise(Signal sig)
      * @see sun.misc.SignalHandler
--- a/jdk/src/java.base/share/classes/sun/misc/Unsafe.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Unsafe.java	Tue May 19 11:40:00 2015 -0700
@@ -641,9 +641,9 @@
      * <li>String: any object (not just a java.lang.String)
      * <li>InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments
      * </ul>
-     * @params hostClass context for linkage, access control, protection domain, and class loader
-     * @params data      bytes of a class file
-     * @params cpPatches where non-null entries exist, they replace corresponding CP entries in data
+     * @param hostClass context for linkage, access control, protection domain, and class loader
+     * @param data      bytes of a class file
+     * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data
      */
     public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches);
 
@@ -808,9 +808,9 @@
      * The system imposes a maximum of 3 samples, representing
      * averages over the last 1,  5,  and  15 minutes, respectively.
      *
-     * @params loadavg an array of double of size nelems
-     * @params nelems the number of samples to be retrieved and
-     *         must be 1 to 3.
+     * @param loadavg an array of double of size nelems
+     * @param nelems the number of samples to be retrieved and
+     *        must be 1 to 3.
      *
      * @return the number of samples actually retrieved; or -1
      *         if the load average is unobtainable.
@@ -1108,7 +1108,6 @@
      * <p>
      * 8-byte atomicity is only guaranteed on platforms on which
      * support atomic accesses to longs.
-     * <p>
      *
      * @param o Java heap object in which the value resides, if any, else
      *        null
--- a/jdk/src/java.base/share/classes/sun/misc/VM.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/VM.java	Tue May 19 11:40:00 2015 -0700
@@ -315,7 +315,7 @@
     }
 
     /*
-     * Add <tt>n</tt> to the objects pending for finalization count.
+     * Add {@code n} to the objects pending for finalization count.
      *
      * @param n an integer value to be added to the objects pending
      * for finalization count
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_de.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_de.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_de extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_es.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_es.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_es extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_fr.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_fr.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_fr extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_it.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_it.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_it extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ja.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ja.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_ja extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ko.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ko.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_ko extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_pt_BR.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_pt_BR.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_pt_BR extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_sv.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_sv.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_sv extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_CN.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_CN.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_zh_CN extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_TW.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_TW.java	Tue May 19 11:40:00 2015 -0700
@@ -26,7 +26,7 @@
 package sun.misc.resources;
 
 /**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
  * for sun.misc.
  *
  * @author Michael Colburn
@@ -35,9 +35,9 @@
 public class Messages_zh_TW extends java.util.ListResourceBundle {
 
     /**
-     * Returns the contents of this <code>ResourceBundle</code>.
-     * <p>
-     * @return the contents of this <code>ResourceBundle</code>.
+     * Returns the contents of this {@code ResourceBundle}.
+     *
+     * @return the contents of this {@code ResourceBundle}.
      */
     public Object[][] getContents() {
         return contents;
--- a/jdk/src/java.base/share/classes/sun/nio/cs/Surrogate.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/Surrogate.java	Tue May 19 11:40:00 2015 -0700
@@ -175,10 +175,10 @@
          * @param  in   The source buffer, from which one more character
          *              will be consumed if c is a high surrogate
          *
-         * @returns  Either a parsed UCS-4 character, in which case the isPair()
-         *           and increment() methods will return meaningful values, or
-         *           -1, in which case error() will return a descriptive result
-         *           object
+         * @return  Either a parsed UCS-4 character, in which case the isPair()
+         *          and increment() methods will return meaningful values, or
+         *          -1, in which case error() will return a descriptive result
+         *          object
          */
         public int parse(char c, CharBuffer in) {
             if (Character.isHighSurrogate(c)) {
@@ -216,10 +216,10 @@
          * @param  ip   The input index
          * @param  il   The input limit
          *
-         * @returns  Either a parsed UCS-4 character, in which case the isPair()
-         *           and increment() methods will return meaningful values, or
-         *           -1, in which case error() will return a descriptive result
-         *           object
+         * @return  Either a parsed UCS-4 character, in which case the isPair()
+         *          and increment() methods will return meaningful values, or
+         *          -1, in which case error() will return a descriptive result
+         *          object
          */
         public int parse(char c, char[] ia, int ip, int il) {
             assert (ia[ip] == c);
@@ -280,9 +280,9 @@
          * @param  dst  The destination buffer, to which one or two UTF-16
          *              characters will be written
          *
-         * @returns  Either a positive count of the number of UTF-16 characters
-         *           written to the destination buffer, or -1, in which case
-         *           error() will return a descriptive result object
+         * @return  Either a positive count of the number of UTF-16 characters
+         *          written to the destination buffer, or -1, in which case
+         *          error() will return a descriptive result object
          */
         public int generate(int uc, int len, CharBuffer dst) {
             if (Character.isBmpCodePoint(uc)) {
@@ -325,9 +325,9 @@
          * @param  dp   The destination position
          * @param  dl   The destination limit
          *
-         * @returns  Either a positive count of the number of UTF-16 characters
-         *           written to the destination buffer, or -1, in which case
-         *           error() will return a descriptive result object
+         * @return  Either a positive count of the number of UTF-16 characters
+         *          written to the destination buffer, or -1, in which case
+         *          error() will return a descriptive result object
          */
         public int generate(int uc, int len, char[] da, int dp, int dl) {
             if (Character.isBmpCodePoint(uc)) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/SunEntries.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SunEntries.java	Tue May 19 11:40:00 2015 -0700
@@ -67,10 +67,6 @@
  *   in RFC 5280. The ValidationAlgorithm attribute notes the
  *   specification that this provider implements.
  *
- * - LDAP is the CertStore type for LDAP repositories. The
- *   LDAPSchema attribute notes the specification defining the
- *   schema that this provider uses to find certificates and CRLs.
- *
  * - JavaPolicy is the default file-based Policy type.
  *
  * - JavaLoginConfig is the default file-based LoginModule Configuration type.
@@ -275,9 +271,6 @@
         /*
          * CertStores
          */
-        map.put("CertStore.LDAP",
-            "sun.security.provider.certpath.ldap.LDAPCertStore");
-        map.put("CertStore.LDAP LDAPSchema", "RFC2587");
         map.put("CertStore.Collection",
             "sun.security.provider.certpath.CollectionCertStore");
         map.put("CertStore.com.sun.security.IndexedCollection",
@@ -310,7 +303,6 @@
         map.put("KeyStore.JKS ImplementedIn", "Software");
         map.put("CertPathValidator.PKIX ImplementedIn", "Software");
         map.put("CertPathBuilder.PKIX ImplementedIn", "Software");
-        map.put("CertStore.LDAP ImplementedIn", "Software");
         map.put("CertStore.Collection ImplementedIn", "Software");
         map.put("CertStore.com.sun.security.IndexedCollection ImplementedIn",
             "Software");
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/CertStoreHelper.java	Thu May 14 12:05:33 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2009, 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.
- */
-
-package sun.security.provider.certpath;
-
-import java.net.URI;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.security.AccessController;
-import java.security.NoSuchAlgorithmException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.security.cert.CertStore;
-import java.security.cert.CertStoreException;
-import java.security.cert.X509CertSelector;
-import java.security.cert.X509CRLSelector;
-import javax.security.auth.x500.X500Principal;
-import java.io.IOException;
-
-import sun.security.util.Cache;
-
-/**
- * Helper used by URICertStore and others when delegating to another CertStore
- * to fetch certs and CRLs.
- */
-
-public abstract class CertStoreHelper {
-
-    private static final int NUM_TYPES = 2;
-    private final static Map<String,String> classMap = new HashMap<>(NUM_TYPES);
-    static {
-        classMap.put(
-            "LDAP",
-            "sun.security.provider.certpath.ldap.LDAPCertStoreHelper");
-        classMap.put(
-            "SSLServer",
-            "sun.security.provider.certpath.ssl.SSLServerCertStoreHelper");
-    };
-    private static Cache<String, CertStoreHelper> cache
-        = Cache.newSoftMemoryCache(NUM_TYPES);
-
-    public static CertStoreHelper getInstance(final String type)
-        throws NoSuchAlgorithmException
-    {
-        CertStoreHelper helper = cache.get(type);
-        if (helper != null) {
-            return helper;
-        }
-        final String cl = classMap.get(type);
-        if (cl == null) {
-            throw new NoSuchAlgorithmException(type + " not available");
-        }
-        try {
-            helper = AccessController.doPrivileged(
-                new PrivilegedExceptionAction<CertStoreHelper>() {
-                    public CertStoreHelper run() throws ClassNotFoundException {
-                        try {
-                            Class<?> c = Class.forName(cl, true, null);
-                            CertStoreHelper csh
-                                = (CertStoreHelper)c.newInstance();
-                            cache.put(type, csh);
-                            return csh;
-                        } catch (InstantiationException |
-                                 IllegalAccessException e) {
-                            throw new AssertionError(e);
-                        }
-                    }
-            });
-            return helper;
-        } catch (PrivilegedActionException e) {
-            throw new NoSuchAlgorithmException(type + " not available",
-                                               e.getException());
-        }
-    }
-
-    static boolean isCausedByNetworkIssue(String type, CertStoreException cse) {
-        switch (type) {
-            case "LDAP":
-            case "SSLServer":
-                try {
-                    CertStoreHelper csh = CertStoreHelper.getInstance(type);
-                    return csh.isCausedByNetworkIssue(cse);
-                } catch (NoSuchAlgorithmException nsae) {
-                    return false;
-                }
-            case "URI":
-                Throwable t = cse.getCause();
-                return (t != null && t instanceof IOException);
-            default:
-                // we don't know about any other remote CertStore types
-                return false;
-        }
-    }
-
-    /**
-     * Returns a CertStore using the given URI as parameters.
-     */
-    public abstract CertStore getCertStore(URI uri)
-        throws NoSuchAlgorithmException, InvalidAlgorithmParameterException;
-
-    /**
-     * Wraps an existing X509CertSelector when needing to avoid DN matching
-     * issues.
-     */
-    public abstract X509CertSelector wrap(X509CertSelector selector,
-                          X500Principal certSubject,
-                          String dn)
-        throws IOException;
-
-    /**
-     * Wraps an existing X509CRLSelector when needing to avoid DN matching
-     * issues.
-     */
-    public abstract X509CRLSelector wrap(X509CRLSelector selector,
-                         Collection<X500Principal> certIssuers,
-                         String dn)
-        throws IOException;
-
-    /**
-     * Returns true if the cause of the CertStoreException is a network
-     * related issue.
-     */
-    public abstract boolean isCausedByNetworkIssue(CertStoreException e);
-}
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Tue May 19 11:40:00 2015 -0700
@@ -466,6 +466,34 @@
                   stackedCerts, params.trustAnchors());
     }
 
+    static boolean isCausedByNetworkIssue(String type, CertStoreException cse) {
+        boolean result;
+        Throwable t = cse.getCause();
+
+        switch (type) {
+            case "LDAP":
+                if (t != null) {
+                    // These two exception classes are inside java.naming module
+                    String cn = t.getClass().getName();
+                    result = (cn.equals("javax.naming.ServiceUnavailableException") ||
+                        cn.equals("javax.naming.CommunicationException"));
+                } else {
+                    result = false;
+                }
+                break;
+            case "SSLServer":
+                result = (t != null && t instanceof IOException);
+                break;
+            case "URI":
+                result = (t != null && t instanceof IOException);
+                break;
+            default:
+                // we don't know about any other remote CertStore types
+                return false;
+        }
+        return result;
+    }
+
     private void checkCRLs(X509Certificate cert, PublicKey prevKey,
                            X509Certificate prevCert, boolean signFlag,
                            boolean allowSeparateKey,
@@ -510,7 +538,7 @@
                                   "CertStoreException: " + e.getMessage());
                 }
                 if (networkFailureException == null &&
-                    CertStoreHelper.isCausedByNetworkIssue(store.getType(),e)) {
+                    isCausedByNetworkIssue(store.getType(),e)) {
                     // save this exception, we may need to throw it later
                     networkFailureException = new CertPathValidatorException(
                         "Unable to determine revocation status due to " +
@@ -557,8 +585,7 @@
             } catch (CertStoreException e) {
                 if (e instanceof CertStoreTypeException) {
                     CertStoreTypeException cste = (CertStoreTypeException)e;
-                    if (CertStoreHelper.isCausedByNetworkIssue(cste.getType(),
-                                                               e)) {
+                    if (isCausedByNetworkIssue(cste.getType(), e)) {
                         throw new CertPathValidatorException(
                             "Unable to determine revocation status due to " +
                             "network error", e, null, -1,
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,6 +42,7 @@
 import java.security.cert.CertStoreSpi;
 import java.security.cert.CRLException;
 import java.security.cert.CRLSelector;
+import java.security.cert.URICertStoreParameters;
 import java.security.cert.X509Certificate;
 import java.security.cert.X509CertSelector;
 import java.security.cert.X509CRL;
@@ -118,9 +119,7 @@
 
     // true if URI is ldap
     private boolean ldap = false;
-    private CertStoreHelper ldapHelper;
     private CertStore ldapCertStore;
-    private String ldapPath;
 
     // Default maximum connect timeout in milliseconds (15 seconds)
     // allowed when downloading CRLs
@@ -165,13 +164,8 @@
         // if ldap URI, use an LDAPCertStore to fetch certs and CRLs
         if (uri.getScheme().toLowerCase(Locale.ENGLISH).equals("ldap")) {
             ldap = true;
-            ldapHelper = CertStoreHelper.getInstance("LDAP");
-            ldapCertStore = ldapHelper.getCertStore(uri);
-            ldapPath = uri.getPath();
-            // strip off leading '/'
-            if (ldapPath.charAt(0) == '/') {
-                ldapPath = ldapPath.substring(1);
-            }
+            URICertStoreParameters lparams = new URICertStoreParameters(uri);
+            ldapCertStore = CertStore.getInstance("LDAP", lparams);
         }
         try {
             factory = CertificateFactory.getInstance("X.509");
@@ -246,20 +240,10 @@
     public synchronized Collection<X509Certificate> engineGetCertificates
         (CertSelector selector) throws CertStoreException {
 
-        // if ldap URI we wrap the CertSelector in an LDAPCertSelector to
-        // avoid LDAP DN matching issues (see LDAPCertSelector for more info)
         if (ldap) {
-            X509CertSelector xsel = (X509CertSelector) selector;
-            try {
-                xsel = ldapHelper.wrap(xsel, xsel.getSubject(), ldapPath);
-            } catch (IOException ioe) {
-                throw new CertStoreException(ioe);
-            }
-            // Fetch the certificates via LDAP. LDAPCertStore has its own
             // caching mechanism, see the class description for more info.
-            // Safe cast since xsel is an X509 certificate selector.
             return (Collection<X509Certificate>)
-                ldapCertStore.getCertificates(xsel);
+                ldapCertStore.getCertificates(selector);
         }
 
         // Return the Certificates for this entry. It returns the cached value
@@ -356,20 +340,11 @@
     public synchronized Collection<X509CRL> engineGetCRLs(CRLSelector selector)
         throws CertStoreException {
 
-        // if ldap URI we wrap the CRLSelector in an LDAPCRLSelector to
-        // avoid LDAP DN matching issues (see LDAPCRLSelector for more info)
         if (ldap) {
-            X509CRLSelector xsel = (X509CRLSelector) selector;
-            try {
-                xsel = ldapHelper.wrap(xsel, null, ldapPath);
-            } catch (IOException ioe) {
-                throw new CertStoreException(ioe);
-            }
             // Fetch the CRLs via LDAP. LDAPCertStore has its own
             // caching mechanism, see the class description for more info.
-            // Safe cast since xsel is an X509 certificate selector.
             try {
-                return (Collection<X509CRL>) ldapCertStore.getCRLs(xsel);
+                return (Collection<X509CRL>) ldapCertStore.getCRLs(selector);
             } catch (CertStoreException cse) {
                 throw new PKIX.CertStoreTypeException("LDAP", cse);
             }
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/ssl/SSLServerCertStore.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/ssl/SSLServerCertStore.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -153,7 +153,7 @@
         throw new UnsupportedOperationException();
     }
 
-    static CertStore getInstance(URI uri)
+    public static CertStore getInstance(URI uri)
         throws InvalidAlgorithmParameterException
     {
         return new CS(new SSLServerCertStore(uri), null, "SSLServer", null);
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/ssl/SSLServerCertStoreHelper.java	Thu May 14 12:05:33 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +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.
- */
-
-package sun.security.provider.certpath.ssl;
-
-import java.io.IOException;
-import java.net.URI;
-import java.security.NoSuchAlgorithmException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.cert.CertStore;
-import java.security.cert.CertStoreException;
-import java.security.cert.X509CertSelector;
-import java.security.cert.X509CRLSelector;
-import java.util.Collection;
-import javax.security.auth.x500.X500Principal;
-
-import sun.security.provider.certpath.CertStoreHelper;
-
-/**
- * SSL implementation of CertStoreHelper.
- */
-public final class SSLServerCertStoreHelper extends CertStoreHelper {
-
-    @Override
-    public CertStore getCertStore(URI uri)
-        throws NoSuchAlgorithmException, InvalidAlgorithmParameterException
-    {
-        return SSLServerCertStore.getInstance(uri);
-    }
-
-    @Override
-    public X509CertSelector wrap(X509CertSelector selector,
-                                 X500Principal certSubject,
-                                 String ldapDN)
-        throws IOException
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public X509CRLSelector wrap(X509CRLSelector selector,
-                                Collection<X500Principal> certIssuers,
-                                String ldapDN)
-        throws IOException
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean isCausedByNetworkIssue(CertStoreException e) {
-        Throwable t = e.getCause();
-        return (t != null && t instanceof IOException);
-    }
-}
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,6 +46,9 @@
 import java.security.cert.CRL;
 import java.security.cert.X509Certificate;
 import java.security.cert.CertificateException;
+import java.security.cert.URICertStoreParameters;
+
+
 import java.text.Collator;
 import java.text.MessageFormat;
 import java.util.*;
@@ -69,7 +72,7 @@
 import sun.security.pkcs10.PKCS10;
 import sun.security.pkcs10.PKCS10Attribute;
 import sun.security.provider.X509Factory;
-import sun.security.provider.certpath.CertStoreHelper;
+import sun.security.provider.certpath.ssl.SSLServerCertStore;
 import sun.security.util.Password;
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
@@ -2208,14 +2211,10 @@
                 }
             }
         } else {    // must be LDAP, and uri is not null
-            // Lazily load LDAPCertStoreHelper if present
-            CertStoreHelper helper = CertStoreHelper.getInstance("LDAP");
-            String path = uri.getPath();
-            if (path.charAt(0) == '/') path = path.substring(1);
-            CertStore s = helper.getCertStore(uri);
-            X509CRLSelector sel =
-                    helper.wrap(new X509CRLSelector(), null, path);
-            return s.getCRLs(sel);
+            URICertStoreParameters params =
+                new URICertStoreParameters(uri);
+            CertStore s = CertStore.getInstance("LDAP", params);
+            return s.getCRLs(new X509CRLSelector());
         }
     }
 
@@ -2463,9 +2462,7 @@
                 out.println(rb.getString("Not.a.signed.jar.file"));
             }
         } else if (sslserver != null) {
-            // Lazily load SSLCertStoreHelper if present
-            CertStoreHelper helper = CertStoreHelper.getInstance("SSLServer");
-            CertStore cs = helper.getCertStore(new URI("https://" + sslserver));
+            CertStore cs = SSLServerCertStore.getInstance(new URI("https://" + sslserver));
             Collection<? extends Certificate> chain;
             try {
                 chain = cs.getCertificates(null);
--- a/jdk/src/java.base/share/classes/sun/security/x509/AVA.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AVA.java	Tue May 19 11:40:00 2015 -0700
@@ -454,7 +454,7 @@
             if (embeddedHex.size() > 0) {
                 // add space(s) before embedded hex bytes
                 for (int i = 0; i < spaceCount; i++) {
-                    temp.append(" ");
+                    temp.append(' ');
                 }
                 spaceCount = 0;
 
@@ -472,7 +472,7 @@
             } else {
                 // add space(s)
                 for (int i = 0; i < spaceCount; i++) {
-                    temp.append(" ");
+                    temp.append(' ');
                 }
                 spaceCount = 0;
                 temp.append((char)c);
@@ -853,7 +853,7 @@
                 }
                 sbuffer.append(c);
             }
-            typeAndValue.append(sbuffer.toString());
+            typeAndValue.append(sbuffer);
         }
         return typeAndValue.toString();
     }
@@ -1039,7 +1039,7 @@
         StringBuilder   retval = new StringBuilder(40);
 
         retval.append(keyword);
-        retval.append("=");
+        retval.append('=');
 
         try {
             String valStr = value.getAsString();
@@ -1147,9 +1147,11 @@
                 // Emit the string ... quote it if needed
                 // if string is already quoted, don't re-quote
                 if (!alreadyQuoted && quoteNeeded) {
-                    retval.append("\"" + sbuffer.toString() + "\"");
+                    retval.append('\"')
+                        .append(sbuffer)
+                        .append('\"');
                 } else {
-                    retval.append(sbuffer.toString());
+                    retval.append(sbuffer);
                 }
             }
         } catch (IOException e) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -196,17 +196,20 @@
      * Return the object as a string.
      */
     public String toString() {
-        String s = super.toString() + "AuthorityKeyIdentifier [\n";
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append("AuthorityKeyIdentifier [\n");
         if (id != null) {
-            s += id.toString();     // id already has a newline
+            sb.append(id);       // id already has a newline
         }
         if (names != null) {
-            s += names.toString() + "\n";
+            sb.append(names).append('\n');
         }
         if (serialNum != null) {
-            s += serialNum.toString() + "\n";
+            sb.append(serialNum).append('\n');
         }
-        return (s + "]\n");
+        sb.append("]\n");
+        return sb.toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/BasicConstraintsExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/BasicConstraintsExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -171,15 +171,11 @@
       * Return user readable form of extension.
       */
      public String toString() {
-         String s = super.toString() + "BasicConstraints:[\n";
-
-         s += ((ca) ? ("  CA:true") : ("  CA:false")) + "\n";
-         if (pathLen >= 0) {
-             s += "  PathLen:" + pathLen + "\n";
-         } else {
-             s += "  PathLen: undefined\n";
-         }
-         return (s + "]\n");
+         return super.toString() +
+             "BasicConstraints:[\n  CA:" + ca +
+             "\n  PathLen:" +
+             ((pathLen >= 0) ? String.valueOf(pathLen) : " undefined") +
+             "\n]\n";
      }
 
      /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/CRLDistributionPointsExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CRLDistributionPointsExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -231,8 +231,8 @@
             distributionPoints = (List<DistributionPoint>)obj;
         } else {
             throw new IOException("Attribute name [" + name +
-                                "] not recognized by " +
-                                "CertAttrSet:" + extensionName + ".");
+                                  "] not recognized by " +
+                                  "CertAttrSet:" + extensionName + '.');
         }
         encodeThis();
     }
@@ -245,8 +245,8 @@
             return distributionPoints;
         } else {
             throw new IOException("Attribute name [" + name +
-                                "] not recognized by " +
-                                "CertAttrSet:" + extensionName + ".");
+                                  "] not recognized by " +
+                                  "CertAttrSet:" + extensionName + '.');
         }
     }
 
--- a/jdk/src/java.base/share/classes/sun/security/x509/CRLNumberExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CRLNumberExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -146,8 +146,8 @@
             }
             crlNumber = (BigInteger)obj;
         } else {
-          throw new IOException("Attribute name not recognized by"
-                                + " CertAttrSet:" + extensionName + ".");
+            throw new IOException("Attribute name not recognized by" +
+                                  " CertAttrSet:" + extensionName + '.');
         }
         encodeThis();
     }
@@ -172,8 +172,8 @@
         if (name.equalsIgnoreCase(NUMBER)) {
             crlNumber = null;
         } else {
-          throw new IOException("Attribute name not recognized by"
-                                + " CertAttrSet:" + extensionName + ".");
+            throw new IOException("Attribute name not recognized by" +
+                                  " CertAttrSet:" + extensionName + '.');
         }
         encodeThis();
     }
@@ -182,10 +182,15 @@
      * Returns a printable representation of the CRLNumberExtension.
      */
     public String toString() {
-        String s = super.toString() + extensionLabel + ": " +
-                   ((crlNumber == null) ? "" : Debug.toHexString(crlNumber))
-                   + "\n";
-        return (s);
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append(extensionLabel)
+            .append(": ");
+        if (crlNumber != null) {
+            sb.append(Debug.toHexString(crlNumber));
+        }
+        sb.append('\n');
+        return sb.toString();
     }
 
     /**
@@ -195,7 +200,7 @@
      * @exception IOException on encoding errors.
      */
     public void encode(OutputStream out) throws IOException {
-       DerOutputStream  tmp = new DerOutputStream();
+        DerOutputStream tmp = new DerOutputStream();
         encode(out, PKIXExtensions.CRLNumber_Id, true);
     }
 
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertException.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertException.java	Tue May 19 11:40:00 2015 -0700
@@ -158,7 +158,7 @@
      */
     public String toString()
     {
-        return "[Certificate Exception: " + getMessage() + "]";
+        return "[Certificate Exception: " + getMessage() + ']';
     }
 
     /**
@@ -168,6 +168,6 @@
     {
         return getVerfDescription()
                 + ( (moreData != null)
-                    ? ( "\n  (" + moreData + ")" ) : "" );
+                    ? ( "\n  (" + moreData + ')' ) : "" );
     }
 }
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -160,10 +160,12 @@
         if (certPolicies == null) {
             return "";
         }
-        StringBuilder sb = new StringBuilder(super.toString());
-        sb.append("CertificatePolicies [\n");
+
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append("CertificatePolicies [\n");
         for (PolicyInformation info : certPolicies) {
-            sb.append(info.toString());
+            sb.append(info);
         }
         sb.append("]\n");
         return sb.toString();
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertificateValidity.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertificateValidity.java	Tue May 19 11:40:00 2015 -0700
@@ -134,8 +134,8 @@
     public String toString() {
         if (notBefore == null || notAfter == null)
             return "";
-        return ("Validity: [From: " + notBefore.toString() +
-             ",\n               To: " + notAfter.toString() + "]");
+        return "Validity: [From: " + notBefore +
+               ",\n               To: " + notAfter + ']';
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/DistributionPoint.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/DistributionPoint.java	Tue May 19 11:40:00 2015 -0700
@@ -380,23 +380,29 @@
      */
     public String toString() {
         StringBuilder sb = new StringBuilder();
+        sb.append("DistributionPoint:\n     ");
         if (fullName != null) {
-            sb.append("DistributionPoint:\n     " + fullName + "\n");
+            sb.append(fullName);
         }
         if (relativeName != null) {
-            sb.append("DistributionPoint:\n     " + relativeName + "\n");
+            sb.append(relativeName);
         }
+        sb.append('\n');
 
         if (reasonFlags != null) {
             sb.append("   ReasonFlags:\n");
             for (int i = 0; i < reasonFlags.length; i++) {
                 if (reasonFlags[i]) {
-                    sb.append("    " + reasonToString(i) + "\n");
+                    sb.append("    ")
+                        .append(reasonToString(i))
+                        .append('\n');
                 }
             }
         }
         if (crlIssuer != null) {
-            sb.append("   CRLIssuer:" + crlIssuer + "\n");
+            sb.append("   CRLIssuer:")
+                .append(crlIssuer)
+                .append('\n');
         }
         return sb.toString();
     }
--- a/jdk/src/java.base/share/classes/sun/security/x509/DistributionPointName.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/DistributionPointName.java	Tue May 19 11:40:00 2015 -0700
@@ -230,13 +230,13 @@
      */
     public String toString() {
         StringBuilder sb = new StringBuilder();
+        sb.append("DistributionPointName:\n     ");
         if (fullName != null) {
-            sb.append("DistributionPointName:\n     " + fullName + "\n");
-
+            sb.append(fullName);
         } else {
-            sb.append("DistributionPointName:\n     " + relativeName + "\n");
+            sb.append(relativeName);
         }
-
+        sb.append('\n');
         return sb.toString();
     }
 }
--- a/jdk/src/java.base/share/classes/sun/security/x509/EDIPartyName.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/EDIPartyName.java	Tue May 19 11:40:00 2015 -0700
@@ -209,10 +209,15 @@
      * Return the printable string.
      */
     public String toString() {
-        return ("EDIPartyName: " +
-                 ((assigner == null) ? "" :
-                   ("  nameAssigner = " + assigner + ","))
-                 + "  partyName = " + party);
+        StringBuilder sb = new StringBuilder("EDIPartyName: ");
+        if (assigner != null) {
+            sb.append("  nameAssigner = ")
+              .append(assigner)
+              .append(',');
+        }
+        sb.append("  partyName = ")
+          .append(party);
+        return sb.toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/Extension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/Extension.java	Tue May 19 11:40:00 2015 -0700
@@ -219,13 +219,8 @@
      * Returns the Extension in user readable form.
      */
     public String toString() {
-        String s = "ObjectId: " + extensionId.toString();
-        if (critical) {
-            s += " Criticality=true\n";
-        } else {
-            s += " Criticality=false\n";
-        }
-        return (s);
+        return "ObjectId: " + extensionId +
+                " Criticality=" + critical + '\n';
     }
 
     // Value to mix up the hash
--- a/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtree.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtree.java	Tue May 19 11:40:00 2015 -0700
@@ -127,15 +127,22 @@
      * Return a printable string of the GeneralSubtree.
      */
     public String toString() {
-        String s = "\n   GeneralSubtree: [\n" +
-            "    GeneralName: " + ((name == null) ? "" : name.toString()) +
-            "\n    Minimum: " + minimum;
-            if (maximum == -1) {
-                s += "\t    Maximum: undefined";
-            } else
-                s += "\t    Maximum: " + maximum;
-            s += "    ]\n";
-        return (s);
+        StringBuilder sb = new StringBuilder();
+        sb.append("\n   GeneralSubtree: [")
+            .append("\n    GeneralName: ");
+        if (name != null) {
+            sb.append(name);
+        }
+        sb.append("\n    Minimum: ")
+            .append(minimum)
+            .append("\n    Maximum: ");
+        if (maximum == -1) {
+            sb.append("undefined");
+        } else {
+            sb.append(maximum);
+        }
+        sb.append("    ]\n");
+        return sb.toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtrees.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtrees.java	Tue May 19 11:40:00 2015 -0700
@@ -124,8 +124,7 @@
      * Return a printable string of the GeneralSubtree.
      */
     public String toString() {
-        String s = "   GeneralSubtrees:\n" + trees.toString() + "\n";
-        return s;
+        return "   GeneralSubtrees:\n" + trees + '\n';
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/IPAddressName.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IPAddressName.java	Tue May 19 11:40:00 2015 -0700
@@ -263,7 +263,7 @@
             if (address.length == 8) {
                 byte[] mask = new byte[4];
                 System.arraycopy(address, 4, mask, 0, 4);
-                name = name + "/" +
+                name = name + '/' +
                        InetAddress.getByAddress(mask).getHostAddress();
             }
         } else {
@@ -285,7 +285,7 @@
                     if (!ba.get(i))
                         break;
                 }
-                name = name + "/" + i;
+                name = name + '/' + i;
                 // Verify remaining bits 0
                 for (; i < 16*8; i++) {
                     if (ba.get(i)) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/IssuerAlternativeNameExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IssuerAlternativeNameExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -140,17 +140,20 @@
      * Returns a printable representation of the IssuerAlternativeName.
      */
     public String toString() {
-
-        String result = super.toString() + "IssuerAlternativeName [\n";
-        if(names == null) {
-            result += "  null\n";
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append("IssuerAlternativeName [\n");
+        if (names == null) {
+            sb.append("  null\n");
         } else {
-            for(GeneralName name: names.names()) {
-                result += "  "+name+"\n";
+            for (GeneralName name : names.names()) {
+                sb.append("  ")
+                    .append(name)
+                    .append('\n');
             }
         }
-        result += "]\n";
-        return result;
+        sb.append("]\n");
+        return sb.toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/IssuingDistributionPointExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IssuingDistributionPointExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -441,9 +441,9 @@
      * Returns the extension as user readable string.
      */
     public String toString() {
-
-        StringBuilder sb = new StringBuilder(super.toString());
-        sb.append("IssuingDistributionPoint [\n  ");
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append("IssuingDistributionPoint [\n  ");
 
         if (distributionPoint != null) {
             sb.append(distributionPoint);
@@ -453,23 +453,18 @@
             sb.append(revocationReasons);
         }
 
-        sb.append((hasOnlyUserCerts)
-                ? ("  Only contains user certs: true")
-                : ("  Only contains user certs: false")).append("\n");
-
-        sb.append((hasOnlyCACerts)
-                ? ("  Only contains CA certs: true")
-                : ("  Only contains CA certs: false")).append("\n");
-
-        sb.append((hasOnlyAttributeCerts)
-                ? ("  Only contains attribute certs: true")
-                : ("  Only contains attribute certs: false")).append("\n");
-
-        sb.append((isIndirectCRL)
-                ? ("  Indirect CRL: true")
-                : ("  Indirect CRL: false")).append("\n");
-
-        sb.append("]\n");
+        sb.append("  Only contains user certs: ")
+            .append(hasOnlyUserCerts)
+            .append('\n')
+            .append("  Only contains CA certs: ")
+            .append(hasOnlyCACerts)
+            .append('\n')
+            .append("  Only contains attribute certs: ")
+            .append(hasOnlyAttributeCerts)
+            .append('\n')
+            .append("  Indirect CRL: ")
+            .append(isIndirectCRL)
+            .append("\n]\n");
 
         return sb.toString();
     }
--- a/jdk/src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -214,12 +214,19 @@
      * Return the printable string.
      */
     public String toString() {
-        return (super.toString() + "NameConstraints: [" +
-                ((permitted == null) ? "" :
-                     ("\n    Permitted:" + permitted.toString())) +
-                ((excluded == null) ? "" :
-                     ("\n    Excluded:" + excluded.toString()))
-                + "   ]\n");
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append("NameConstraints: [");
+        if (permitted != null) {
+            sb.append("\n    Permitted:")
+                .append(permitted);
+        }
+        if (excluded != null) {
+            sb.append("\n    Excluded:")
+                .append(excluded);
+        }
+        sb.append("   ]\n");
+        return sb.toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -175,19 +175,24 @@
      * Return the extension as user readable string.
      */
     public String toString() {
-        String s;
-        s = super.toString() + "PolicyConstraints: [" + "  Require: ";
-        if (require == -1)
-            s += "unspecified;";
-        else
-            s += require + ";";
-        s += "\tInhibit: ";
-        if (inhibit == -1)
-            s += "unspecified";
-        else
-            s += inhibit;
-        s += " ]\n";
-        return s;
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append("PolicyConstraints: [")
+            .append("  Require: ");
+        if (require == -1) {
+            sb.append("unspecified;");
+        } else {
+            sb.append(require)
+                .append(';');
+        }
+        sb.append("\tInhibit: ");
+        if (inhibit == -1) {
+            sb.append("unspecified");
+        } else {
+            sb.append(inhibit);
+        }
+        sb.append(" ]\n");
+        return sb.toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyInformation.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyInformation.java	Tue May 19 11:40:00 2015 -0700
@@ -258,9 +258,7 @@
      * Return a printable representation of the PolicyInformation.
      */
     public String toString() {
-        StringBuilder s = new StringBuilder("  [" + policyIdentifier.toString());
-        s.append(policyQualifiers + "  ]\n");
-        return s.toString();
+        return "  [" + policyIdentifier + policyQualifiers + "  ]\n";
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -175,11 +175,22 @@
      * Return the printable string.
      */
     public String toString() {
-        return(super.toString() +
-                "PrivateKeyUsage: [\n" +
-                ((notBefore == null) ? "" : "From: " + notBefore.toString() + ", ")
-                + ((notAfter == null) ? "" : "To: " + notAfter.toString())
-                + "]\n");
+        StringBuilder sb = new StringBuilder();
+        sb.append(super.toString())
+            .append("PrivateKeyUsage: [\n");
+        if (notBefore != null) {
+            sb.append("From: ")
+                .append(notBefore);
+            if (notAfter != null) {
+                sb.append(", ");
+            }
+        }
+        if (notAfter != null) {
+            sb.append("To: ")
+                .append(notAfter);
+        }
+        sb.append("]\n");
+        return sb.toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/RDN.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/RDN.java	Tue May 19 11:40:00 2015 -0700
@@ -348,14 +348,11 @@
             return assertion[0].toString();
         }
 
-        StringBuilder sb = new StringBuilder();
+        StringJoiner sj = new StringJoiner(" + ");
         for (int i = 0; i < assertion.length; i++) {
-            if (i != 0) {
-                sb.append(" + ");
-            }
-            sb.append(assertion[i].toString());
+            sj.add(assertion[i].toString());
         }
-        return sb.toString();
+        return sj.toString();
     }
 
     /*
@@ -376,14 +373,11 @@
             return assertion[0].toRFC1779String(oidMap);
         }
 
-        StringBuilder sb = new StringBuilder();
+        StringJoiner sj = new StringJoiner(" + ");
         for (int i = 0; i < assertion.length; i++) {
-            if (i != 0) {
-                sb.append(" + ");
-            }
-            sb.append(assertion[i].toRFC1779String(oidMap));
+            sj.add(assertion[i].toRFC1779String(oidMap));
         }
-        return sb.toString();
+        return sj.toString();
     }
 
     /*
--- a/jdk/src/java.base/share/classes/sun/security/x509/SerialNumber.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SerialNumber.java	Tue May 19 11:40:00 2015 -0700
@@ -101,7 +101,7 @@
      * Return the SerialNumber as user readable string.
      */
     public String toString() {
-        return ("SerialNumber: [" + Debug.toHexString(serialNum) + "]");
+        return "SerialNumber: [" + Debug.toHexString(serialNum) + ']';
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -238,8 +238,8 @@
      * Return the extension as user readable string.
      */
     public String toString() {
-        return super.toString() + "SubjectInfoAccess [\n  "
-               + accessDescriptions + "\n]\n";
+        return super.toString() +
+            "SubjectInfoAccess [\n  " + accessDescriptions + "\n]\n";
     }
 
 }
--- a/jdk/src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java	Tue May 19 11:40:00 2015 -0700
@@ -115,8 +115,8 @@
      * Returns a printable representation.
      */
     public String toString() {
-        return super.toString() + "SubjectKeyIdentifier [\n"
-                + String.valueOf(id) + "]\n";
+        return super.toString() +
+            "SubjectKeyIdentifier [\n" + id + "]\n";
     }
 
     /**
--- a/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java	Tue May 19 11:40:00 2015 -0700
@@ -31,6 +31,7 @@
 import java.security.AccessController;
 import java.security.Principal;
 import java.util.*;
+import java.util.StringJoiner;
 
 import sun.security.util.*;
 import javax.security.auth.x500.X500Principal;
@@ -689,14 +690,11 @@
          * The encodings of adjoining RelativeDistinguishedNames are separated
          * by a comma character (',' ASCII 44).
          */
-        StringBuilder fullname = new StringBuilder(48);
+        StringJoiner sj = new StringJoiner(",");
         for (int i = names.length - 1; i >= 0; i--) {
-            if (i < names.length - 1) {
-                fullname.append(',');
-            }
-            fullname.append(names[i].toRFC2253String(oidMap));
+            sj.add(names[i].toRFC2253String(oidMap));
         }
-        return fullname.toString();
+        return sj.toString();
     }
 
     public String getRFC2253CanonicalName() {
@@ -722,14 +720,11 @@
          * The encodings of adjoining RelativeDistinguishedNames are separated
          * by a comma character (',' ASCII 44).
          */
-        StringBuilder fullname = new StringBuilder(48);
+        StringJoiner sj = new StringJoiner(",");
         for (int i = names.length - 1; i >= 0; i--) {
-            if (i < names.length - 1) {
-                fullname.append(',');
-            }
-            fullname.append(names[i].toRFC2253String(true));
+            sj.add(names[i].toRFC2253String(true));
         }
-        canonicalDn = fullname.toString();
+        canonicalDn = sj.toString();
         return canonicalDn;
     }
 
@@ -1064,16 +1059,16 @@
             return;
         }
 
-        StringBuilder sb = new StringBuilder(48);
-        if (names != null) {
-            for (int i = names.length - 1; i >= 0; i--) {
-                if (i != names.length - 1) {
-                    sb.append(", ");
-                }
-                sb.append(names[i].toString());
-            }
+        if (names == null) {
+            dn = "";
+            return;
         }
-        dn = sb.toString();
+
+        StringJoiner sj = new StringJoiner(", ");
+        for (int i = names.length - 1; i >= 0; i--) {
+            sj.add(names[i].toString());
+        }
+        dn = sj.toString();
     }
 
     /*
@@ -1090,16 +1085,15 @@
             return names[0].toRFC1779String(oidMap);
         }
 
-        StringBuilder sb = new StringBuilder(48);
-        if (names != null) {
-            for (int i = names.length - 1; i >= 0; i--) {
-                if (i != names.length - 1) {
-                    sb.append(", ");
-                }
-                sb.append(names[i].toRFC1779String(oidMap));
-            }
+        if (names == null) {
+            return "";
         }
-        return sb.toString();
+
+        StringJoiner sj = new StringJoiner(", ");
+        for (int i = names.length - 1; i >= 0; i--) {
+            sj.add(names[i].toRFC1779String(oidMap));
+        }
+        return sj.toString();
     }
 
     /****************************************************************/
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLEntryImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLEntryImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -291,40 +291,47 @@
     public String toString() {
         StringBuilder sb = new StringBuilder();
 
-        sb.append(serialNumber.toString());
-        sb.append("  On: " + revocationDate.toString());
+        sb.append(serialNumber)
+            .append("  On: ")
+            .append(revocationDate);
         if (certIssuer != null) {
-            sb.append("\n    Certificate issuer: " + certIssuer);
+            sb.append("\n    Certificate issuer: ")
+                .append(certIssuer);
         }
         if (extensions != null) {
             Collection<Extension> allEntryExts = extensions.getAllExtensions();
             Extension[] exts = allEntryExts.toArray(new Extension[0]);
 
-            sb.append("\n    CRL Entry Extensions: " + exts.length);
+            sb.append("\n    CRL Entry Extensions: ")
+                .append(exts.length);
             for (int i = 0; i < exts.length; i++) {
-                sb.append("\n    [" + (i+1) + "]: ");
+                sb.append("\n    [")
+                    .append(i+1)
+                    .append("]: ");
                 Extension ext = exts[i];
                 try {
                     if (OIDMap.getClass(ext.getExtensionId()) == null) {
-                        sb.append(ext.toString());
+                        sb.append(ext);
                         byte[] extValue = ext.getExtensionValue();
                         if (extValue != null) {
                             DerOutputStream out = new DerOutputStream();
                             out.putOctetString(extValue);
                             extValue = out.toByteArray();
                             HexDumpEncoder enc = new HexDumpEncoder();
-                            sb.append("Extension unknown: "
-                                      + "DER encoded OCTET string =\n"
-                                      + enc.encodeBuffer(extValue) + "\n");
+                            sb.append("Extension unknown: ")
+                                .append("DER encoded OCTET string =\n")
+                                .append(enc.encodeBuffer(extValue))
+                                .append('\n');
                         }
-                    } else
-                        sb.append(ext.toString()); //sub-class exists
+                    } else {
+                        sb.append(ext); //sub-class exists
+                    }
                 } catch (Exception e) {
                     sb.append(", Error parsing this extension");
                 }
             }
         }
-        sb.append("\n");
+        sb.append('\n');
         return sb.toString();
     }
 
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -537,47 +537,65 @@
      */
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("X.509 CRL v" + (version+1) + "\n");
+        sb.append("X.509 CRL v")
+            .append(version+1)
+            .append('\n');
         if (sigAlgId != null)
-            sb.append("Signature Algorithm: " + sigAlgId.toString() +
-                  ", OID=" + (sigAlgId.getOID()).toString() + "\n");
+            sb.append("Signature Algorithm: ")
+                .append(sigAlgId)
+                .append(", OID=")
+                .append(sigAlgId.getOID())
+                .append('\n');
         if (issuer != null)
-            sb.append("Issuer: " + issuer.toString() + "\n");
+            sb.append("Issuer: ")
+                .append(issuer)
+                .append('\n');
         if (thisUpdate != null)
-            sb.append("\nThis Update: " + thisUpdate.toString() + "\n");
+            sb.append("\nThis Update: ")
+                .append(thisUpdate)
+                .append('\n');
         if (nextUpdate != null)
-            sb.append("Next Update: " + nextUpdate.toString() + "\n");
+            sb.append("Next Update: ")
+                .append(nextUpdate)
+                .append('\n');
         if (revokedList.isEmpty())
             sb.append("\nNO certificates have been revoked\n");
         else {
-            sb.append("\nRevoked Certificates: " + revokedList.size());
+            sb.append("\nRevoked Certificates: ")
+                .append(revokedList.size());
             int i = 1;
             for (X509CRLEntry entry: revokedList) {
-                sb.append("\n[" + i++ + "] " + entry.toString());
+                sb.append("\n[")
+                    .append(i++)
+                    .append("] ")
+                    .append(entry);
             }
         }
         if (extensions != null) {
             Collection<Extension> allExts = extensions.getAllExtensions();
             Object[] objs = allExts.toArray();
-            sb.append("\nCRL Extensions: " + objs.length);
+            sb.append("\nCRL Extensions: ")
+                .append(objs.length);
             for (int i = 0; i < objs.length; i++) {
-                sb.append("\n[" + (i+1) + "]: ");
+                sb.append("\n[").append(i+1).append("]: ");
                 Extension ext = (Extension)objs[i];
                 try {
-                   if (OIDMap.getClass(ext.getExtensionId()) == null) {
-                       sb.append(ext.toString());
-                       byte[] extValue = ext.getExtensionValue();
-                       if (extValue != null) {
-                           DerOutputStream out = new DerOutputStream();
-                           out.putOctetString(extValue);
-                           extValue = out.toByteArray();
-                           HexDumpEncoder enc = new HexDumpEncoder();
-                           sb.append("Extension unknown: "
-                                     + "DER encoded OCTET string =\n"
-                                     + enc.encodeBuffer(extValue) + "\n");
-                      }
-                   } else
-                       sb.append(ext.toString()); // sub-class exists
+                    if (OIDMap.getClass(ext.getExtensionId()) == null) {
+                        sb.append(ext);
+                        byte[] extValue = ext.getExtensionValue();
+                        if (extValue != null) {
+                            DerOutputStream out = new DerOutputStream();
+                            out.putOctetString(extValue);
+                            extValue = out.toByteArray();
+                            HexDumpEncoder enc = new HexDumpEncoder();
+                            sb.append("Extension unknown: ")
+                                .append("DER encoded OCTET string =\n")
+                                .append(enc.encodeBuffer(extValue))
+                                .append('\n');
+                        }
+                    } else {
+                        sb.append(ext); // sub-class exists
+                    }
                 } catch (Exception e) {
                     sb.append(", Error parsing this extension");
                 }
@@ -585,10 +603,12 @@
         }
         if (signature != null) {
             HexDumpEncoder encoder = new HexDumpEncoder();
-            sb.append("\nSignature:\n" + encoder.encodeBuffer(signature)
-                      + "\n");
-        } else
+            sb.append("\nSignature:\n")
+                .append(encoder.encodeBuffer(signature))
+                .append('\n');
+        } else {
             sb.append("NOT signed yet\n");
+        }
         return sb.toString();
     }
 
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -81,7 +81,7 @@
 
     private static final long serialVersionUID = -3457612960190864406L;
 
-    private static final String DOT = ".";
+    private static final char DOT = '.';
     /**
      * Public attribute names.
      */
@@ -799,17 +799,10 @@
         if (info == null || algId == null || signature == null)
             return "";
 
-        StringBuilder sb = new StringBuilder();
-
-        sb.append("[\n");
-        sb.append(info.toString() + "\n");
-        sb.append("  Algorithm: [" + algId.toString() + "]\n");
-
         HexDumpEncoder encoder = new HexDumpEncoder();
-        sb.append("  Signature:\n" + encoder.encodeBuffer(signature));
-        sb.append("\n]");
-
-        return sb.toString();
+        return "[\n" + info + '\n' +
+            "  Algorithm: [" + algId + "]\n" +
+            "  Signature:\n" + encoder.encodeBuffer(signature) + "\n]";
     }
 
     // the strongly typed gets, as per java.security.cert.X509Certificate
@@ -1941,31 +1934,30 @@
      * only contains 0-9 and A-F. No small case, no colon.
      */
     private String getCertificateFingerPrint(String mdAlg) {
-        String fingerPrint = "";
         try {
             byte[] encCertInfo = getEncoded();
             MessageDigest md = MessageDigest.getInstance(mdAlg);
             byte[] digest = md.digest(encCertInfo);
-            StringBuffer buf = new StringBuffer();
+            StringBuilder sb = new StringBuilder(digest.length * 2);
             for (int i = 0; i < digest.length; i++) {
-                byte2hex(digest[i], buf);
+                byte2hex(digest[i], sb);
             }
-            fingerPrint = buf.toString();
+            return sb.toString();
         } catch (NoSuchAlgorithmException | CertificateEncodingException e) {
             // ignored
         }
-        return fingerPrint;
+        return "";
     }
 
     /**
-     * Converts a byte to hex digit and writes to the supplied buffer
+     * Converts a byte to hex digit and writes to the supplied builder
      */
-    private static void byte2hex(byte b, StringBuffer buf) {
+    private static void byte2hex(byte b, StringBuilder buf) {
         char[] hexChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
                 '9', 'A', 'B', 'C', 'D', 'E', 'F' };
         int high = ((b & 0xf0) >> 4);
         int low = (b & 0x0f);
-        buf.append(hexChars[high]);
-        buf.append(hexChars[low]);
+        buf.append(hexChars[high])
+            .append(hexChars[low]);
     }
 }
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CertInfo.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CertInfo.java	Tue May 19 11:40:00 2015 -0700
@@ -299,55 +299,60 @@
         }
         StringBuilder sb = new StringBuilder();
 
-        sb.append("[\n");
-        sb.append("  " + version.toString() + "\n");
-        sb.append("  Subject: " + subject.toString() + "\n");
-        sb.append("  Signature Algorithm: " + algId.toString() + "\n");
-        sb.append("  Key:  " + pubKey.toString() + "\n");
-        sb.append("  " + interval.toString() + "\n");
-        sb.append("  Issuer: " + issuer.toString() + "\n");
-        sb.append("  " + serialNum.toString() + "\n");
+        sb.append("[\n")
+            .append("  ").append(version).append('\n')
+            .append("  Subject: ").append(subject).append('\n')
+            .append("  Signature Algorithm: ").append(algId).append('\n')
+            .append("  Key:  ").append(pubKey).append('\n')
+            .append("  ").append(interval).append('\n')
+            .append("  Issuer: ").append(issuer).append('\n')
+            .append("  ").append(serialNum).append('\n');
 
         // optional v2, v3 extras
         if (issuerUniqueId != null) {
-            sb.append("  Issuer Id:\n" + issuerUniqueId.toString() + "\n");
+            sb.append("  Issuer Id:\n").append(issuerUniqueId).append('\n');
         }
         if (subjectUniqueId != null) {
-            sb.append("  Subject Id:\n" + subjectUniqueId.toString() + "\n");
+            sb.append("  Subject Id:\n").append(subjectUniqueId).append('\n');
         }
         if (extensions != null) {
             Collection<Extension> allExts = extensions.getAllExtensions();
             Extension[] exts = allExts.toArray(new Extension[0]);
-            sb.append("\nCertificate Extensions: " + exts.length);
+            sb.append("\nCertificate Extensions: ").append(exts.length);
             for (int i = 0; i < exts.length; i++) {
-                sb.append("\n[" + (i+1) + "]: ");
+                sb.append("\n[").append(i+1).append("]: ");
                 Extension ext = exts[i];
                 try {
                     if (OIDMap.getClass(ext.getExtensionId()) == null) {
-                        sb.append(ext.toString());
+                        sb.append(ext);
                         byte[] extValue = ext.getExtensionValue();
                         if (extValue != null) {
                             DerOutputStream out = new DerOutputStream();
                             out.putOctetString(extValue);
                             extValue = out.toByteArray();
                             HexDumpEncoder enc = new HexDumpEncoder();
-                            sb.append("Extension unknown: "
-                                      + "DER encoded OCTET string =\n"
-                                      + enc.encodeBuffer(extValue) + "\n");
+                            sb.append("Extension unknown: ")
+                                .append("DER encoded OCTET string =\n")
+                                .append(enc.encodeBuffer(extValue))
+                                .append('\n');
                         }
-                    } else
-                        sb.append(ext.toString()); //sub-class exists
+                    } else {
+                        sb.append(ext); //sub-class exists
+                    }
                 } catch (Exception e) {
                     sb.append(", Error parsing this extension");
                 }
             }
             Map<String,Extension> invalid = extensions.getUnparseableExtensions();
             if (invalid.isEmpty() == false) {
-                sb.append("\nUnparseable certificate extensions: " + invalid.size());
+                sb.append("\nUnparseable certificate extensions: ")
+                    .append(invalid.size());
                 int i = 1;
                 for (Extension ext : invalid.values()) {
-                    sb.append("\n[" + (i++) + "]: ");
-                    sb.append(ext);
+                    sb.append("\n[")
+                        .append(i++)
+                        .append("]: ")
+                        .append(ext);
                 }
             }
         }
--- a/jdk/src/java.base/share/classes/sun/text/CompactByteArray.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/CompactByteArray.java	Tue May 19 11:40:00 2015 -0700
@@ -49,7 +49,7 @@
  * Han ideographs have the same value.  However, lookup is much faster than a
  * hash table.
  * A compact array of any primitive data type serves two purposes:
- * <UL type = round>
+ * <UL type = circle>
  *     <LI>Fast access of the indexed values.
  *     <LI>Smaller memory footprint.
  * </UL>
--- a/jdk/src/java.base/share/classes/sun/text/ComposedCharIter.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/ComposedCharIter.java	Tue May 19 11:40:00 2015 -0700
@@ -50,7 +50,7 @@
     }
 
     /**
-     * Construct a new <tt>ComposedCharIter</tt>.  The iterator will return
+     * Construct a new {@code ComposedCharIter}.  The iterator will return
      * all Unicode characters with canonical decompositions, excluding Korean
      * Hangul characters.
      */
@@ -58,10 +58,10 @@
 
     /**
      * Returns the next precomposed Unicode character.
-     * Repeated calls to <tt>next</tt> return all of the precomposed characters defined
+     * Repeated calls to {@code next} return all of the precomposed characters defined
      * by Unicode, in ascending order.  After all precomposed characters have
-     * been returned, {@link #hasNext} will return <tt>false</tt> and further calls
-     * to <tt>next</tt> will return {@link #DONE}.
+     * been returned, {@link #hasNext} will return {@code false} and further calls
+     * to {@code next} will return {@link #DONE}.
      */
     public int next() {
         if (curChar == decompNum - 1) {
--- a/jdk/src/java.base/share/classes/sun/text/Normalizer.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/Normalizer.java	Tue May 19 11:40:00 2015 -0700
@@ -32,7 +32,7 @@
  * This Normalizer is for Unicode 3.2 support for IDNA only.
  * Developers should not use this class.
  *
- * @ since 1.6
+ * @since 1.6
  */
 public final class Normalizer {
 
--- a/jdk/src/java.base/share/classes/sun/text/bidi/BidiBase.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/bidi/BidiBase.java	Tue May 19 11:40:00 2015 -0700
@@ -81,14 +81,13 @@
  *
  * <h3>General remarks about the API:</h3>
  *
- * The &quot;limit&quot; of a sequence of characters is the position just after
+ * The "limit" of a sequence of characters is the position just after
  * their last character, i.e., one more than that position.
  * <p>
  *
- * Some of the API methods provide access to &quot;runs&quot;. Such a
- * &quot;run&quot; is defined as a sequence of characters that are at the same
+ * Some of the API methods provide access to "runs". Such a
+ * "run" is defined as a sequence of characters that are at the same
  * embedding level after performing the Bidi algorithm.
- * <p>
  *
  * <h3>Basic concept: paragraph</h3>
  * A piece of text can be divided into several paragraphs by characters
@@ -141,7 +140,8 @@
  * these special values are designed that way. Also, the implementation
  * assumes that MAX_EXPLICIT_LEVEL is odd.
  *
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
  * <li>{@link #LEVEL_DEFAULT_LTR}
  * <li>{@link #LEVEL_DEFAULT_RTL}
  * <li>{@link #LEVEL_OVERRIDE}
@@ -153,7 +153,8 @@
  * Reordering mode values indicate which variant of the Bidi algorithm to
  * use.
  *
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
  * <li>{@link #setReorderingMode}
  * <li>{@link #REORDER_DEFAULT}
  * <li>{@link #REORDER_NUMBERS_SPECIAL}
@@ -166,7 +167,8 @@
  *
  * <h3>Basic concept: Reordering Options</h3>
  * Reordering options can be applied during Bidi text transformations.
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
  * <li>{@link #setReorderingOptions}
  * <li>{@link #OPTION_DEFAULT}
  * <li>{@link #OPTION_INSERT_MARKS}
@@ -202,7 +204,7 @@
  * and therefore its implementation omitted from this sample code.</li>
  * </ul>
  *
- * <pre>
+ * <pre>{@code
  *
  *  package com.ibm.icu.dev.test.bidi;
  *
@@ -451,7 +453,7 @@
  *      }
  *  }
  *
- * </pre>
+ * }</pre>
  */
 
 public class BidiBase {
@@ -2419,9 +2421,9 @@
      *        (same index) character if the level has the
      *        <code>LEVEL_OVERRIDE</code> bit set.<br><br>
      *        Except for that bit, it must be
-     *        <code>paraLevel<=embeddingLevels[]<=MAX_EXPLICIT_LEVEL</code>,
+     *        {@code paraLevel<=embeddingLevels[]<=MAX_EXPLICIT_LEVEL},
      *        with one exception: a level of zero may be specified for a
-     *        paragraph separator even if <code>paraLevel&gt;0</code> when multiple
+     *        paragraph separator even if {@code paraLevel > 0} when multiple
      *        paragraphs are submitted in the same call to <code>setPara()</code>.<br><br>
      *        <strong>Caution: </strong>A reference to this array, not a copy
      *        of the levels, will be stored in the <code>Bidi</code> object;
@@ -2680,7 +2682,7 @@
      * For example, in pure LTR text with numbers the numbers would get
      * a resolved level of 2 higher than the surrounding text according to
      * the algorithm. This implementation may set all resolved levels to
-     * the same value in such a case.<p>
+     * the same value in such a case.
      *
      * @param paragraph a paragraph of text with optional character and
      *        paragraph attribute information
@@ -2817,7 +2819,7 @@
     }
 
     /**
-     * Get the index of a paragraph, given a position within the text.<p>
+     * Get the index of a paragraph, given a position within the text.
      *
      * @param charIndex is the index of a character within the text, in the
      *        range <code>[0..getProcessedLength()-1]</code>.
--- a/jdk/src/java.base/share/classes/sun/text/bidi/BidiRun.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/bidi/BidiRun.java	Tue May 19 11:40:00 2015 -0700
@@ -42,7 +42,7 @@
 /**
  * A BidiRun represents a sequence of characters at the same embedding level.
  * The Bidi algorithm decomposes a piece of text into sequences of characters
- * at the same embedding level, each such sequence is called a <quote>run</quote>.
+ * at the same embedding level, each such sequence is called a "run".
  *
  * <p>A BidiRun represents such a run by storing its essential properties,
  * but does not duplicate the characters which form the run.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ICUBinary.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ICUBinary.java	Tue May 19 11:40:00 2015 -0700
@@ -65,7 +65,7 @@
     /**
     * <p>ICU data header reader method.
     * Takes a ICU generated big-endian input stream, parse the ICU standard
-    * file header and authenticates them.</p>
+    * file header and authenticates them.
     * <p>Header format:
     * <ul>
     *     <li> Header size (char)
@@ -84,7 +84,7 @@
     *                             [0] major [1] minor [2] milli [3] micro
     *     <li> Unicode version (4 bytes) this ICU is based on.
     * </ul>
-    * </p>
+    *
     * <p>
     * Example of use:<br>
     * <pre>
@@ -98,7 +98,7 @@
     *    System.out.println("This is not a ICU data file");
     * }
     * </pre>
-    * </p>
+    *
     * @param inputStream input stream that contains the ICU data header
     * @param dataFormatIDExpected Data format expected. An array of 4 bytes
     *                     information about the data format.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/IntTrie.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/IntTrie.java	Tue May 19 11:40:00 2015 -0700
@@ -58,7 +58,7 @@
     * trie.</p>
     * @param inputStream file input stream to a ICU data file, containing
     *                    the trie
-    * @param dataManipulate object which provides methods to parse the char
+    * @param datamanipulate object which provides methods to parse the char
     *                        data
     * @throws IOException thrown when data reading fails
     * @draft 2.1
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/NormalizerBase.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/NormalizerBase.java	Tue May 19 11:40:00 2015 -0700
@@ -55,16 +55,16 @@
  * In Unicode, this can be encoded as a single character (the
  * "composed" form):
  *
- * <p>
+ * <pre>
  *      00C1    LATIN CAPITAL LETTER A WITH ACUTE
- * </p>
+ * </pre>
  *
  * or as two separate characters (the "decomposed" form):
  *
- * <p>
+ * <pre>
  *      0041    LATIN CAPITAL LETTER A
  *      0301    COMBINING ACUTE ACCENT
- * </p>
+ * </pre>
  *
  * To a user of your program, however, both of these sequences should be
  * treated as the same "user-level" character "A with acute accent".  When you
@@ -76,17 +76,17 @@
  *
  * Similarly, the string "ffi" can be encoded as three separate letters:
  *
- * <p>
+ * <pre>
  *      0066    LATIN SMALL LETTER F
  *      0066    LATIN SMALL LETTER F
  *      0069    LATIN SMALL LETTER I
- * </p>
+ * </pre>
  *
  * or as the single character
  *
- * <p>
+ * <pre>
  *      FB03    LATIN SMALL LIGATURE FFI
- * </p>
+ * </pre>
  *
  * The ffi ligature is not a distinct semantic character, and strictly speaking
  * it shouldn't be in Unicode at all, but it was included for compatibility
@@ -555,12 +555,12 @@
     //-------------------------------------------------------------------------
 
     /**
-     * Creates a new <tt>Normalizer</tt> object for iterating over the
+     * Creates a new {@code Normalizer} object for iterating over the
      * normalized form of a given string.
      * <p>
-     * The <tt>options</tt> parameter specifies which optional
-     * <tt>Normalizer</tt> features are to be enabled for this object.
-     * <p>
+     * The {@code options} parameter specifies which optional
+     * {@code Normalizer} features are to be enabled for this object.
+     *
      * @param str  The string to be normalized.  The normalization
      *              will start at the beginning of the string.
      *
@@ -579,9 +579,9 @@
     }
 
     /**
-     * Creates a new <tt>Normalizer</tt> object for iterating over the
+     * Creates a new {@code Normalizer} object for iterating over the
      * normalized form of the given text.
-     * <p>
+     *
      * @param iter  The input text to be normalized.  The normalization
      *              will start at the beginning of the string.
      *
@@ -592,9 +592,9 @@
     }
 
     /**
-     * Creates a new <tt>Normalizer</tt> object for iterating over the
+     * Creates a new {@code Normalizer} object for iterating over the
      * normalized form of the given text.
-     * <p>
+     *
      * @param iter  The input text to be normalized.  The normalization
      *              will start at the beginning of the string.
      *
@@ -615,13 +615,13 @@
     }
 
     /**
-     * Clones this <tt>Normalizer</tt> object.  All properties of this
+     * Clones this {@code Normalizer} object.  All properties of this
      * object are duplicated in the new object, including the cloning of any
      * {@link CharacterIterator} that was passed in to the constructor
      * or to {@link #setText(CharacterIterator) setText}.
      * However, the text storage underlying
-     * the <tt>CharacterIterator</tt> is not duplicated unless the
-     * iterator's <tt>clone</tt> method does so.
+     * the {@code CharacterIterator} is not duplicated unless the
+     * iterator's {@code clone} method does so.
      * @stable ICU 2.8
      */
     public Object clone() {
@@ -791,7 +791,7 @@
     //-------------------------------------------------------------------------
 
     /**
-     * Return the current character in the normalized text->
+     * Return the current character in the normalized text.
      * @return The codepoint as an int
      * @stable ICU 2.8
      */
@@ -872,10 +872,10 @@
      * while {@link #next} and {@link #previous} iterate through characters
      * in the normalized <em>output</em>.  This means that there is not
      * necessarily a one-to-one correspondence between characters returned
-     * by <tt>next</tt> and <tt>previous</tt> and the indices passed to and
-     * returned from <tt>setIndex</tt> and {@link #getIndex}.
-     * <p>
-     * @param index the desired index in the input text->
+     * by {@code next} and {@code previous} and the indices passed to and
+     * returned from {@code setIndex} and {@link #getIndex}.
+     *
+     * @param index the desired index in the input text.
      *
      * @return   the first normalized character that is the result of iterating
      *            forward starting at the given index.
@@ -894,8 +894,8 @@
 
     /**
      * Retrieve the index of the start of the input text. This is the begin
-     * index of the <tt>CharacterIterator</tt> or the start (i.e. 0) of the
-     * <tt>String</tt> over which this <tt>Normalizer</tt> is iterating
+     * index of the {@code CharacterIterator} or the start (i.e. 0) of the
+     * {@code String} over which this {@code Normalizer} is iterating
      * @deprecated ICU 2.2. Use startIndex() instead.
      * @return The codepoint as an int
      * @see #startIndex
@@ -907,8 +907,8 @@
 
     /**
      * Retrieve the index of the end of the input text.  This is the end index
-     * of the <tt>CharacterIterator</tt> or the length of the <tt>String</tt>
-     * over which this <tt>Normalizer</tt> is iterating
+     * of the {@code CharacterIterator} or the length of the {@code String}
+     * over which this {@code Normalizer} is iterating
      * @deprecated ICU 2.2. Use endIndex() instead.
      * @return The codepoint as an int
      * @see #endIndex
@@ -927,9 +927,9 @@
      * <b>Note:</b> This method sets the position in the <em>input</em>, while
      * {@link #next} and {@link #previous} iterate through characters in the
      * <em>output</em>.  This means that there is not necessarily a one-to-one
-     * correspondence between characters returned by <tt>next</tt> and
-     * <tt>previous</tt> and the indices passed to and returned from
-     * <tt>setIndex</tt> and {@link #getIndex}.
+     * correspondence between characters returned by {@code next} and
+     * {@code previous} and the indices passed to and returned from
+     * {@code setIndex} and {@link #getIndex}.
      * @return The current iteration position
      * @stable ICU 2.8
      */
@@ -942,9 +942,9 @@
     }
 
     /**
-     * Retrieve the index of the end of the input text->  This is the end index
-     * of the <tt>CharacterIterator</tt> or the length of the <tt>String</tt>
-     * over which this <tt>Normalizer</tt> is iterating
+     * Retrieve the index of the end of the input text. This is the end index
+     * of the {@code CharacterIterator} or the length of the {@code String}
+     * over which this {@code Normalizer} is iterating
      * @return The current iteration position
      * @stable ICU 2.8
      */
@@ -963,9 +963,9 @@
      * return previously buffers characters in the old normalization mode
      * until the iteration is able to re-sync at the next base character.
      * It is safest to call {@link #setText setText()}, {@link #first},
-     * {@link #last}, etc. after calling <tt>setMode</tt>.
-     * <p>
-     * @param newMode the new mode for this <tt>Normalizer</tt>.
+     * {@link #last}, etc. after calling {@code setMode}.
+     *
+     * @param newMode the new mode for this {@code Normalizer}.
      * The supported modes are:
      * <ul>
      *  <li>{@link #COMPOSE}        - Unicode canonical decompositiion
@@ -985,7 +985,7 @@
         mode = newMode;
     }
     /**
-     * Return the basic operation performed by this <tt>Normalizer</tt>
+     * Return the basic operation performed by this {@code Normalizer}
      *
      * @see #setMode
      * @stable ICU 2.8
@@ -995,8 +995,8 @@
     }
 
     /**
-     * Set the input text over which this <tt>Normalizer</tt> will iterate.
-     * The iteration position is set to the beginning of the input text->
+     * Set the input text over which this {@code Normalizer} will iterate.
+     * The iteration position is set to the beginning of the input text.
      * @param newText   The new string to be normalized.
      * @stable ICU 2.8
      */
@@ -1011,8 +1011,8 @@
     }
 
     /**
-     * Set the input text over which this <tt>Normalizer</tt> will iterate.
-     * The iteration position is set to the beginning of the input text->
+     * Set the input text over which this {@code Normalizer} will iterate.
+     * The iteration position is set to the beginning of the input text.
      * @param newText   The new string to be normalized.
      * @stable ICU 2.8
      */
@@ -1571,7 +1571,7 @@
     //
 
     /**
-     * Creates a new <tt>Normalizer</tt> object for iterating over the
+     * Creates a new {@code Normalizer} object for iterating over the
      * normalized form of a given string.
      *
      * @param str  The string to be normalized.  The normalization
@@ -1646,7 +1646,6 @@
      * perform further tests to arrive at a true/false result.
      * @param str       the input string to be checked to see if it is normalized
      * @param form      the normalization form
-     * @param options   the optional features to be enabled.
      */
     public static boolean isNormalized(String str, Normalizer.Form form) {
         return isNormalized(str, form, UNICODE_LATEST);
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/RangeValueIterator.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/RangeValueIterator.java	Tue May 19 11:40:00 2015 -0700
@@ -38,12 +38,13 @@
 package sun.text.normalizer;
 
 /**
- * <p>Interface for enabling iteration over sets of <int index, int value>,
+ * <p>Interface for enabling iteration over sets of
+ * {@code <int index, int value>},
  * where index is the sorted integer index in ascending order and value, its
- * associated integer value.</p>
+ * associated integer value.
  * <p>The result for each iteration is the consecutive range of
- * <int index, int value> with the same value. Result is represented by
- * <start, limit, value> where</p>
+ * {@code <int index, int value>} with the same value. Result is represented by
+ * {@code <start, limit, value>} where
  * <ul>
  * <li> start is the starting integer of the result range
  * <li> limit is 1 after the maximum integer that follows start, such that
@@ -56,10 +57,10 @@
  * Hence value(start) = value(start + 1) = .... = value(start + n) = .... =
  * value(limit - 1). However value(start -1) != value(start) and
  * value(limit) != value(start).
- * </p>
+ *
  * <p>Most implementations will be created by factory methods, such as the
  * character type iterator in UCharacter.getTypeIterator. See example below.
- * </p>
+ *
  * Example of use:<br>
  * <pre>
  * RangeValueIterator iterator = UCharacter.getTypeIterator();
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Replaceable.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Replaceable.java	Tue May 19 11:40:00 2015 -0700
@@ -71,10 +71,9 @@
  *   <li>If there is no previous character (i.e. start == 0), use the
  *   following character</li>
  *   <li>If there is no following character (i.e. the replaceable was
- *   empty), use default metadata<br>
+ *   empty), use default metadata</li>
  *   <li>If the code point U+FFFF is seen, it should be interpreted as
- *   a special marker having no metadata<li>
- *   </li>
+ *   a special marker having no metadata</li>
  * </ul>
  * If this is not the behavior, the subclass should document any differences.
  *
@@ -111,10 +110,10 @@
      * starting at index <code>dstStart</code> and ending at index
      * <code>dstStart + (srcLimit-srcStart) - 1</code>.
      *
-     * @param srcStart the beginning index to copy, inclusive; <code>0
-     * <= start <= limit</code>.
+     * @param srcStart the beginning index to copy, inclusive;
+     *        {@code 0 <= start <= limit}.
      * @param srcLimit the ending index to copy, exclusive;
-     * <code>start <= limit <= length()</code>.
+     *        {@code start <= limit <= length()}.
      * @param dst the destination array.
      * @param dstStart the start offset in the destination array.
      * @stable ICU 2.0
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableString.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableString.java	Tue May 19 11:40:00 2015 -0700
@@ -109,10 +109,10 @@
      * starting at index <code>dstStart</code> and ending at index
      * <code>dstStart + (srcLimit-srcStart) - 1</code>.
      *
-     * @param srcStart the beginning index to copy, inclusive; <code>0
-     * <= start <= limit</code>.
+     * @param srcStart the beginning index to copy, inclusive;
+     *        {@code 0 <= start <= limit}.
      * @param srcLimit the ending index to copy, exclusive;
-     * <code>start <= limit <= length()</code>.
+     *        {@code start <= limit <= length()}.
      * @param dst the destination array.
      * @param dstStart the start offset in the destination array.
      * @stable ICU 2.0
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableUCharacterIterator.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableUCharacterIterator.java	Tue May 19 11:40:00 2015 -0700
@@ -150,14 +150,12 @@
     }
 
     /**
-     * <p>Sets the currentIndex to the specified currentIndex in the text and returns that
+     * Sets the currentIndex to the specified currentIndex in the text and returns that
      * single UTF16 character at currentIndex.
-     * This assumes the text is stored as 16-bit code units.</p>
+     * This assumes the text is stored as 16-bit code units.
      * @param currentIndex the currentIndex within the text.
      * @exception IllegalArgumentException is thrown if an invalid currentIndex is
      *            supplied. i.e. currentIndex is out of bounds.
-     * @return the character at the specified currentIndex or DONE if the specified
-     *         currentIndex is equal to the end of the text.
      */
     public void setIndex(int currentIndex) {
         if (currentIndex < 0 || currentIndex > replaceable.length()) {
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/RuleCharacterIterator.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/RuleCharacterIterator.java	Tue May 19 11:40:00 2015 -0700
@@ -101,22 +101,25 @@
     public static final int DONE = -1;
 
     /**
-     * Bitmask option to enable parsing of variable names.  If (options &
-     * PARSE_VARIABLES) != 0, then an embedded variable will be expanded to
+     * Bitmask option to enable parsing of variable names.
+     * If {@code (options & PARSE_VARIABLES) != 0},
+     * then an embedded variable will be expanded to
      * its value.  Variables are parsed using the SymbolTable API.
      */
     public static final int PARSE_VARIABLES = 1;
 
     /**
-     * Bitmask option to enable parsing of escape sequences.  If (options &
-     * PARSE_ESCAPES) != 0, then an embedded escape sequence will be expanded
+     * Bitmask option to enable parsing of escape sequences.
+     * If {@code (options & PARSE_ESCAPES) != 0},
+     * then an embedded escape sequence will be expanded
      * to its value.  Escapes are parsed using Utility.unescapeAt().
      */
     public static final int PARSE_ESCAPES   = 2;
 
     /**
-     * Bitmask option to enable skipping of whitespace.  If (options &
-     * SKIP_WHITESPACE) != 0, then whitespace characters will be silently
+     * Bitmask option to enable skipping of whitespace.
+     * If {@code (options & SKIP_WHITESPACE) != 0},
+     * then whitespace characters will be silently
      * skipped, as if they were not present in the input.  Whitespace
      * characters are defined by UCharacterProperty.isRuleWhiteSpace().
      */
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/SymbolTable.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/SymbolTable.java	Tue May 19 11:40:00 2015 -0700
@@ -78,7 +78,7 @@
 
     /**
      * Lookup the characters associated with this string and return it.
-     * Return <tt>null</tt> if no such name exists.  The resultant
+     * Return {@code null} if no such name exists.  The resultant
      * array may have length zero.
      * @param s the symbolic name to lookup
      * @return a char array containing the name's value, or null if
@@ -91,7 +91,7 @@
 
     /**
      * Lookup the UnicodeMatcher associated with the given character, and
-     * return it.  Return <tt>null</tt> if not found.
+     * return it.  Return {@code null} if not found.
      * @param ch a 32-bit code point from 0 to 0x10FFFF inclusive.
      * @return the UnicodeMatcher object represented by the given
      * character, or null if there is no mapping for ch.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Trie.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Trie.java	Tue May 19 11:40:00 2015 -0700
@@ -160,8 +160,10 @@
 
     /**
     * Lead surrogate code points' index displacement in the index array.
+    * <pre>{@code
     * 0x10000-0xd800=0x2800
     * 0x2800 >> INDEX_STAGE_1_SHIFT_
+    * }</pre>
     */
     protected static final int LEAD_INDEX_OFFSET_ = 0x2800 >> 5;
     /**
@@ -191,7 +193,7 @@
     /**
      * Number of index (stage 1) entries per lead surrogate.
      * Same as number of index entries for 1024 trail surrogates,
-     * ==0x400>>INDEX_STAGE_1_SHIFT_
+     * {@code ==0x400>>INDEX_STAGE_1_SHIFT_}
      */
     protected static final int SURROGATE_BLOCK_COUNT=(1<<SURROGATE_BLOCK_BITS);
     /** Length of the BMP portion of the index (stage 1) array. */
@@ -297,7 +299,7 @@
     /**
     * Internal trie getter from a code point.
     * Could be faster(?) but longer with
-    *   if((c32)<=0xd7ff) { (result)=_TRIE_GET_RAW(trie, data, 0, c32); }
+    * {@code if((c32)<=0xd7ff) { (result)=_TRIE_GET_RAW(trie, data, 0, c32); }}
     * Gets the offset to data which the codepoint points to
     * @param ch codepoint
     * @return offset to data
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/TrieIterator.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/TrieIterator.java	Tue May 19 11:40:00 2015 -0700
@@ -37,17 +37,17 @@
 package sun.text.normalizer;
 
 /**
- * <p>Class enabling iteration of the values in a Trie.</p>
+ * Class enabling iteration of the values in a Trie.
  * <p>Result of each iteration contains the interval of codepoints that have
- * the same value type and the value type itself.</p>
+ * the same value type and the value type itself.
  * <p>The comparison of each codepoint value is done via extract(), which the
- * default implementation is to return the value as it is.</p>
+ * default implementation is to return the value as it is.
  * <p>Method extract() can be overwritten to perform manipulations on
- * codepoint values in order to perform specialized comparison.</p>
+ * codepoint values in order to perform specialized comparison.
  * <p>TrieIterator is designed to be a generic iterator for the CharTrie
  * and the IntTrie, hence to accommodate both types of data, the return
- * result will be in terms of int (32 bit) values.</p>
- * <p>See com.ibm.icu.text.UCharacterTypeIterator for examples of use.</p>
+ * result will be in terms of int (32 bit) values.
+ * <p>See com.ibm.icu.text.UCharacterTypeIterator for examples of use.
  * <p>Notes for porting utrie_enum from icu4c to icu4j:<br>
  * Internally, icu4c's utrie_enum performs all iterations in its body. In Java
  * sense, the caller will have to pass a object with a callback function
@@ -63,18 +63,17 @@
  * the method extract(int) (equivalent to UTrieEnumValue). Independent of icu4j,
  * the caller will have to code his own iteration and flesh out the task
  * (equivalent to UTrieEnumRange) to be performed in the iteration loop.
- * </p>
- * <p>There are basically 3 usage scenarios for porting:</p>
+ *
+ * <p>There are basically 3 usage scenarios for porting:
  * <p>1) UTrieEnumValue is the only implemented callback then just implement a
  * subclass of TrieIterator and override the extract(int) method. The
  * extract(int) method is analogus to UTrieEnumValue callback.
- * </p>
+ *
  * <p>2) UTrieEnumValue and UTrieEnumRange both are implemented then implement
- * a subclass of TrieIterator, override the extract method and iterate, e.g
- * </p>
- * <p>utrie_enum(&normTrie, _enumPropertyStartsValue, _enumPropertyStartsRange,
- *               set);<br>
- * In Java :<br>
+ * a subclass of TrieIterator, override the extract method and iterate, e.g.<br>
+ * {@code utrie_enum(&normTrie, _enumPropertyStartsValue, _enumPropertyStartsRange,
+ *               set);}<br>
+ * In Java:<br>
  * <pre>
  * class TrieIteratorImpl extends TrieIterator{
  *     public TrieIteratorImpl(Trie data){
@@ -90,17 +89,17 @@
  *     // port the implementation of _enumPropertyStartsRange
  * }
  * </pre>
- * </p>
+ *
  * <p>3) UTrieEnumRange is the only implemented callback then just implement
  * the while loop, when utrie_enum is called
- * <pre>
+ * <pre>{@code
  * // utrie_enum(&fcdTrie, NULL, _enumPropertyStartsRange, set);
  * TrieIterator fcdIter  = new TrieIterator(fcdTrieImpl.fcdTrie);
  * while(fcdIter.next(result)){
  *     set.add(result.start);
  * }
- * </pre>
- * </p>
+ * }</pre>
+ *
  * @author synwee
  * @see com.ibm.icu.impl.Trie
  * @see com.ibm.icu.lang.UCharacterTypeIterator
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacter.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacter.java	Tue May 19 11:40:00 2015 -0700
@@ -128,7 +128,7 @@
  * Annex C: Compatibility Properties of UTS #18 Unicode Regular Expressions
  * (http://www.unicode.org/reports/tr18/#Compatibility_Properties).
  * </p>
- * <p>
+ * <pre>{@code
  * API access for C/POSIX character classes is as follows:
  * - alpha:     isUAlphabetic(c) or hasBinaryProperty(c, UProperty.ALPHABETIC)
  * - lower:     isULowercase(c) or hasBinaryProperty(c, UProperty.LOWERCASE)
@@ -142,7 +142,7 @@
  * - cntrl:     getType(c)==CONTROL
  * - graph:     hasBinaryProperty(c, UProperty.POSIX_GRAPH)
  * - print:     hasBinaryProperty(c, UProperty.POSIX_PRINT)
- * </p>
+ * }</pre>
  * <p>
  * The C/POSIX character classes are also available in UnicodeSet patterns,
  * using patterns like [:graph:] or \p{graph}.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacterIterator.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacterIterator.java	Tue May 19 11:40:00 2015 -0700
@@ -200,8 +200,7 @@
      * iterator obtained by calling <code>getLength()</code>.
      * <b>Usage:</b>
      *
-     * <code>
-     * <pre>
+     * <pre>{@code
      *         UChacterIterator iter = new UCharacterIterator.getInstance(text);
      *         char[] buf = new char[iter.getLength()];
      *         iter.getText(buf);
@@ -217,15 +216,14 @@
      *                 buf = new char[iter.getLength()];
      *             }
      *         }
-     * </pre>
-     * </code>
+     * }</pre>
      *
      * @param fillIn an array of chars to fill with the underlying UTF-16 code
      *         units.
      * @param offset the position within the array to start putting the data.
      * @return the number of code units added to fillIn, as a convenience
      * @exception IndexOutOfBounds exception if there is not enough
-     *            room after offset in the array, or if offset < 0.
+     *            room after offset in the array, or if offset {@literal <} 0.
      * @stable ICU 2.4
      */
     public abstract int getText(char[] fillIn, int offset);
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UTF16.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UTF16.java	Tue May 19 11:40:00 2015 -0700
@@ -38,26 +38,26 @@
 
 /**
  * <p>Standalone utility class providing UTF16 character conversions and
- * indexing conversions.</p>
+ * indexing conversions.
  * <p>Code that uses strings alone rarely need modification.
  * By design, UTF-16 does not allow overlap, so searching for strings is a safe
  * operation. Similarly, concatenation is always safe. Substringing is safe if
  * the start and end are both on UTF-32 boundaries. In normal code, the values
  * for start and end are on those boundaries, since they arose from operations
  * like searching. If not, the nearest UTF-32 boundaries can be determined
- * using <code>bounds()</code>.</p>
+ * using <code>bounds()</code>.
  * <strong>Examples:</strong>
  * <p>The following examples illustrate use of some of these methods.
- * <pre>
+ * <pre>{@code
  * // iteration forwards: Original
- * for (int i = 0; i &lt; s.length(); ++i) {
+ * for (int i = 0; i < s.length(); ++i) {
  *     char ch = s.charAt(i);
  *     doSomethingWith(ch);
  * }
  *
  * // iteration forwards: Changes for UTF-32
  * int ch;
- * for (int i = 0; i &lt; s.length(); i+=UTF16.getCharCount(ch)) {
+ * for (int i = 0; i < s.length(); i+=UTF16.getCharCount(ch)) {
  *     ch = UTF16.charAt(s,i);
  *     doSomethingWith(ch);
  * }
@@ -74,7 +74,7 @@
  *     ch = UTF16.charAt(s,i);
  *     doSomethingWith(ch);
  * }
- * </pre>
+ * }</pre>
  * <strong>Notes:</strong>
  * <ul>
  *   <li>
@@ -515,12 +515,12 @@
 
     /**
      * <p>Converts argument code point and returns a String object representing
-     * the code point's value in UTF16 format.</p>
+     * the code point's value in UTF16 format.
      * <p>This method does not check for the validity of the codepoint, the
      * results are not guaranteed if a invalid codepoint is passed as
-     * argument.</p>
+     * argument.
      * <p>The result is a string whose length is 1 for non-supplementary code
-     * points, 2 otherwise.</p>
+     * points, 2 otherwise.
      * @param ch code point
      * @return string representation of the code point
      */
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeMatcher.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeMatcher.java	Tue May 19 11:40:00 2015 -0700
@@ -45,7 +45,8 @@
 public interface UnicodeMatcher {
 
     /**
-     * The character at index i, where i < contextStart || i >= contextLimit,
+     * The character at index {@code i}, where
+     * {@code i < contextStart || i >= contextLimit},
      * is ETHER.  This allows explicit matching by rules and UnicodeSets
      * of text outside the context.  In traditional terms, this allows anchoring
      * at the start and/or end.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSet.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSet.java	Tue May 19 11:40:00 2015 -0700
@@ -107,8 +107,8 @@
  *     </tr>
  *     <tr>
  *       <td nowrap valign="top" align="left"><code>[a{ab}{ac}]</code></td>
- *       <td valign="top">The character 'a' and the multicharacter strings &quot;ab&quot; and
- *       &quot;ac&quot;</td>
+ *       <td valign="top">The character 'a' and the multicharacter strings "ab" and
+ *       "ac"</td>
  *     </tr>
  *     <tr>
  *       <td nowrap valign="top" align="left"><code>[\p{Lu}]</code></td>
@@ -148,10 +148,10 @@
  * literal.  Thus "[a\\-b]", "[-ab]", and "[ab-]" all indicate the same
  * set of three characters, 'a', 'b', and '-'.
  *
- * <p>Sets may be intersected using the '&' operator or the asymmetric
+ * <p>Sets may be intersected using the {@literal '&'} operator or the asymmetric
  * set difference may be taken using the '-' operator, for example,
- * "[[:L:]&[\\u0000-\\u0FFF]]" indicates the set of all Unicode letters
- * with values less than 4096.  Operators ('&' and '|') have equal
+ * "{@code [[:L:]&[\\u0000-\\u0FFF]]}" indicates the set of all Unicode letters
+ * with values less than 4096.  Operators ({@literal '&'} and '|') have equal
  * precedence and bind left-to-right.  Thus
  * "[[:L:]-[a-z]-[\\u0100-\\u01FF]]" is equivalent to
  * "[[[:L:]-[a-z]]-[\\u0100-\\u01FF]]".  This only really matters for
@@ -166,7 +166,7 @@
  * that is, U+0000 through 'a'-1 and 'z'+1 through U+10FFFF
  * <tr valign=top><td nowrap><code>[[<em>pat1</em>][<em>pat2</em>]]</code>
  * <td>The union of sets specified by <em>pat1</em> and <em>pat2</em>
- * <tr valign=top><td nowrap><code>[[<em>pat1</em>]&[<em>pat2</em>]]</code>
+ * <tr valign=top><td nowrap><code>[[<em>pat1</em>]&amp;[<em>pat2</em>]]</code>
  * <td>The intersection of sets specified by <em>pat1</em> and <em>pat2</em>
  * <tr valign=top><td nowrap><code>[[<em>pat1</em>]-[<em>pat2</em>]]</code>
  * <td>The asymmetric difference of sets specified by <em>pat1</em> and
@@ -227,7 +227,7 @@
  *     </tr>
  *     <tr>
  *       <td nowrap valign="top" align="right"><code>property :=&nbsp; </code></td>
- *       <td valign="top"><em>a Unicode property set pattern</td>
+ *       <td valign="top"><em>a Unicode property set pattern</em></td>
  *     </tr>
  *   </table>
  *   <br>
@@ -337,8 +337,8 @@
     }
 
     /**
-     * Constructs a set containing the given range. If <code>end >
-     * start</code> then an empty set is created.
+     * Constructs a set containing the given range.
+     * If {@code end > start} then an empty set is created.
      *
      * @param start first character, inclusive, of range
      * @param end last character, inclusive, of range
@@ -651,7 +651,7 @@
      * Adds the specified multicharacter to this set if it is not already
      * present.  If this set already contains the multicharacter,
      * the call leaves this set unchanged.
-     * Thus "ch" => {"ch"}
+     * Thus {@code "ch" => {"ch"}}
      * <br><b>Warning: you cannot add an empty string ("") to a UnicodeSet.</b>
      * @param s the source string
      * @return this object, for chaining
@@ -691,7 +691,7 @@
     /**
      * Complements the specified range in this set.  Any character in
      * the range will be removed if it is in this set, or will be
-     * added if it is not in this set.  If <code>end > start</code>
+     * added if it is not in this set.  If {@code end > start}
      * then an empty range is complemented, leaving the set unchanged.
      *
      * @param start first character, inclusive, of range to be removed
@@ -1698,8 +1698,8 @@
      * Modifies this set to contain those code points which have the
      * given value for the given property.  Prior contents of this
      * set are lost.
-     * @param propertyAlias
-     * @param valueAlias
+     * @param propertyAlias the property alias
+     * @param valueAlias the value alias
      * @param symbols if not null, then symbols are first called to see if a property
      * is available. If true, then everything else is skipped.
      * @return this set
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSetIterator.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSetIterator.java	Tue May 19 11:40:00 2015 -0700
@@ -73,35 +73,35 @@
 public class UnicodeSetIterator {
 
     /**
-     * Value of <tt>codepoint</tt> if the iterator points to a string.
-     * If <tt>codepoint == IS_STRING</tt>, then examine
-     * <tt>string</tt> for the current iteration result.
+     * Value of {@code codepoint} if the iterator points to a string.
+     * If {@code codepoint == IS_STRING}, then examine
+     * {@code string} for the current iteration result.
      * @stable ICU 2.0
      */
     public static int IS_STRING = -1;
 
     /**
-     * Current code point, or the special value <tt>IS_STRING</tt>, if
+     * Current code point, or the special value {@code IS_STRING}, if
      * the iterator points to a string.
      * @stable ICU 2.0
      */
     public int codepoint;
 
     /**
-     * When iterating over ranges using <tt>nextRange()</tt>,
-     * <tt>codepointEnd</tt> contains the inclusive end of the
-     * iteration range, if <tt>codepoint != IS_STRING</tt>.  If
-     * iterating over code points using <tt>next()</tt>, or if
-     * <tt>codepoint == IS_STRING</tt>, then the value of
-     * <tt>codepointEnd</tt> is undefined.
+     * When iterating over ranges using {@code nextRange()},
+     * {@code codepointEnd} contains the inclusive end of the
+     * iteration range, if {@code codepoint != IS_STRING}.  If
+     * iterating over code points using {@code next()}, or if
+     * {@code codepoint == IS_STRING}, then the value of
+     * {@code codepointEnd} is undefined.
      * @stable ICU 2.0
      */
     public int codepointEnd;
 
     /**
-     * If <tt>codepoint == IS_STRING</tt>, then <tt>string</tt> points
-     * to the current string.  If <tt>codepoint != IS_STRING</tt>, the
-     * value of <tt>string</tt> is undefined.
+     * If {@code codepoint == IS_STRING}, then {@code string} points
+     * to the current string.  If {@code codepoint != IS_STRING}, the
+     * value of {@code string} is undefined.
      * @stable ICU 2.0
      */
     public String string;
@@ -118,17 +118,17 @@
     /**
      * Returns the next element in the set, either a code point range
      * or a string.  If there are no more elements in the set, return
-     * false.  If <tt>codepoint == IS_STRING</tt>, the value is a
-     * string in the <tt>string</tt> field.  Otherwise the value is a
-     * range of one or more code points from <tt>codepoint</tt> to
-     * <tt>codepointeEnd</tt> inclusive.
+     * false.  If {@code codepoint == IS_STRING}, the value is a
+     * string in the {@code string} field.  Otherwise the value is a
+     * range of one or more code points from {@code codepoint} to
+     * {@code codepointeEnd} inclusive.
      *
      * <p>The order of iteration is all code points ranges in sorted
      * order, followed by all strings sorted order.  Ranges are
-     * disjoint and non-contiguous.  <tt>string</tt> is undefined
-     * unless <tt>codepoint == IS_STRING</tt>.  Do not mix calls to
-     * <tt>next()</tt> and <tt>nextRange()</tt> without calling
-     * <tt>reset()</tt> between them.  The results of doing so are
+     * disjoint and non-contiguous.  {@code string} is undefined
+     * unless {@code codepoint == IS_STRING}.  Do not mix calls to
+     * {@code next()} and {@code nextRange()} without calling
+     * {@code reset()} between them.  The results of doing so are
      * undefined.
      *
      * @return true if there was another element in the set and this
@@ -162,8 +162,8 @@
     /**
      * Sets this iterator to visit the elements of the given set and
      * resets it to the start of that set.  The iterator is valid only
-     * so long as <tt>set</tt> is valid.
-     * @param set the set to iterate over.
+     * so long as {@code set} is valid.
+     * @param uset the set to iterate over.
      * @stable ICU 2.0
      */
     public void reset(UnicodeSet uset) {
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Utility.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Utility.java	Tue May 19 11:40:00 2015 -0700
@@ -227,7 +227,7 @@
 
     /**
      * Convert a integer to size width hex uppercase digits.
-     * E.g., hex('a', 4, str) => "0041".
+     * E.g., {@code hex('a', 4, str) => "0041"}.
      * Append the output to the given StringBuffer.
      * If width is too small to fit, nothing will be appended to output.
      */
@@ -237,7 +237,7 @@
 
     /**
      * Convert a integer to size width (minimum) hex uppercase digits.
-     * E.g., hex('a', 4, str) => "0041".  If the integer requires more
+     * E.g., {@code hex('a', 4, str) => "0041"}.  If the integer requires more
      * than width digits, more will be used.
      */
     public static String hex(int ch, int width) {
@@ -334,8 +334,8 @@
     }
 
     /**
-     * Escape unprintable characters using <backslash>uxxxx notation
-     * for U+0000 to U+FFFF and <backslash>Uxxxxxxxx for U+10000 and
+     * Escape unprintable characters using {@code <backslash>uxxxx} notation
+     * for U+0000 to U+FFFF and {@code <backslash>Uxxxxxxxx} for U+10000 and
      * above.  If the character is printable ASCII, then do nothing
      * and return FALSE.  Otherwise, append the escaped notation and
      * return TRUE.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/VersionInfo.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/VersionInfo.java	Tue May 19 11:40:00 2015 -0700
@@ -53,7 +53,7 @@
      * @param version version String in the format of "major.minor.milli.micro"
      *                or "major.minor.milli" or "major.minor" or "major",
      *                where major, minor, milli, micro are non-negative numbers
-     *                <= 255. If the trailing version numbers are
+     *                {@literal <=} 255. If the trailing version numbers are
      *                not specified they are taken as 0s. E.g. Version "3.1" is
      *                equivalent to "3.1.0.0".
      * @return an instance of VersionInfo with the argument version.
@@ -98,12 +98,12 @@
 
     /**
      * Returns an instance of VersionInfo with the argument version.
-     * @param major major version, non-negative number <= 255.
-     * @param minor minor version, non-negative number <= 255.
-     * @param milli milli version, non-negative number <= 255.
-     * @param micro micro version, non-negative number <= 255.
+     * @param major major version, non-negative number {@literal <=} 255.
+     * @param minor minor version, non-negative number {@literal <=} 255.
+     * @param milli milli version, non-negative number {@literal <=} 255.
+     * @param micro micro version, non-negative number {@literal <=} 255.
      * @exception throws an IllegalArgumentException when either arguments are
-     *                                     negative or > 255
+     *                                     negative or {@literal >} 255
      * @stable ICU 2.6
      */
     public static VersionInfo getInstance(int major, int minor, int milli,
--- a/jdk/src/java.base/share/conf/security/java.security	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/share/conf/security/java.security	Tue May 19 11:40:00 2015 -0700
@@ -78,6 +78,7 @@
 security.provider.tbd=com.sun.security.sasl.Provider
 security.provider.tbd=org.jcp.xml.dsig.internal.dom.XMLDSigRI
 security.provider.tbd=sun.security.smartcardio.SunPCSC
+security.provider.tbd=sun.security.provider.certpath.ldap.JdkLDAP
 #ifdef windows
 security.provider.tbd=sun.security.mscapi.SunMSCAPI
 #endif
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java	Tue May 19 11:40:00 2015 -0700
@@ -270,22 +270,6 @@
             throw x;
         }
 
-        // fail if the file is a directory
-        if (flags.read) {
-            UnixException exc = null;
-            try {
-                if (UnixFileAttributes.get(fd).isDirectory()) {
-                    exc = new UnixException(EISDIR);
-                }
-            } catch (UnixException x) {
-                exc = x;
-            }
-            if (exc != null) {
-                close(fd);
-                throw exc;
-            }
-        }
-
         // unlink file immediately if delete on close. The spec is clear that
         // an implementation cannot guarantee to unlink the correct file when
         // replaced by an attacker after it is opened.
--- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java	Tue May 19 11:40:00 2015 -0700
@@ -33,6 +33,7 @@
 import java.lang.ref.WeakReference;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.locks.ReentrantLock;
 import sun.misc.JavaAWTAccess;
 import sun.misc.ManagedLocalsThread;
 import sun.misc.SharedSecrets;
@@ -180,10 +181,16 @@
     // initialization has been done)
     private volatile boolean readPrimordialConfiguration;
     // Have we initialized global (root) handlers yet?
-    // This gets set to false in readConfiguration
-    private boolean initializedGlobalHandlers = true;
-    // True if JVM death is imminent and the exit hook has been called.
-    private boolean deathImminent;
+    // This gets set to STATE_UNINITIALIZED in readConfiguration
+    private static final int
+            STATE_INITIALIZED = 0, // initial state
+            STATE_INITIALIZING = 1,
+            STATE_READING_CONFIG = 2,
+            STATE_UNINITIALIZED = 3,
+            STATE_SHUTDOWN = 4;    // terminal state
+    private volatile int globalHandlersState; // = STATE_INITIALIZED;
+    // A concurrency lock for reset(), readConfiguration() and Cleaner.
+    private final ReentrantLock configurationLock = new ReentrantLock();
 
     // This list contains the loggers for which some handlers have been
     // explicitly configured in the configuration file.
@@ -264,13 +271,12 @@
             // before synchronized block. Otherwise deadlocks are possible.
             LogManager mgr = manager;
 
-            // If the global handlers haven't been initialized yet, we
-            // don't want to initialize them just so we can close them!
-            synchronized (LogManager.this) {
-                // Note that death is imminent.
-                deathImminent = true;
-                initializedGlobalHandlers = true;
-            }
+            // set globalHandlersState to STATE_SHUTDOWN atomically so that
+            // no attempts are made to (re)initialize the handlers or (re)read
+            // the configuration again. This is terminal state.
+            configurationLock.lock();
+            globalHandlersState = STATE_SHUTDOWN;
+            configurationLock.unlock();
 
             // Do a reset to close all active handlers.
             reset();
@@ -1314,8 +1320,14 @@
 
     public void reset() throws SecurityException {
         checkPermission();
+
         List<CloseOnReset> persistent;
-        synchronized (this) {
+
+        // We don't want reset() and readConfiguration()
+        // to run in parallel
+        configurationLock.lock();
+        try {
+            // install new empty properties
             props = new Properties();
             // make sure we keep the loggers persistent until reset is done.
             // Those are the loggers for which we previously created a
@@ -1323,26 +1335,41 @@
             // from being gc'ed until those handlers are closed.
             persistent = new ArrayList<>(closeOnResetLoggers);
             closeOnResetLoggers.clear();
-            // Since we are doing a reset we no longer want to initialize
-            // the global handlers, if they haven't been initialized yet.
-            initializedGlobalHandlers = true;
+
+            // if reset has been called from shutdown-hook (Cleaner),
+            // or if reset has been called from readConfiguration() which
+            // already holds the lock and will change the state itself,
+            // then do not change state here...
+            if (globalHandlersState != STATE_SHUTDOWN &&
+                globalHandlersState != STATE_READING_CONFIG) {
+                // ...else user called reset()...
+                // Since we are doing a reset we no longer want to initialize
+                // the global handlers, if they haven't been initialized yet.
+                globalHandlersState = STATE_INITIALIZED;
+            }
+
+            for (LoggerContext cx : contexts()) {
+                resetLoggerContext(cx);
+            }
+
+            persistent.clear();
+        } finally {
+            configurationLock.unlock();
         }
-        for (LoggerContext cx : contexts()) {
-            Enumeration<String> enum_ = cx.getLoggerNames();
-            while (enum_.hasMoreElements()) {
-                String name = enum_.nextElement();
-                Logger logger = cx.findLogger(name);
-                if (logger != null) {
-                    resetLogger(logger);
-                }
+    }
+
+    private void resetLoggerContext(LoggerContext cx) {
+        Enumeration<String> enum_ = cx.getLoggerNames();
+        while (enum_.hasMoreElements()) {
+            String name = enum_.nextElement();
+            Logger logger = cx.findLogger(name);
+            if (logger != null) {
+                resetLogger(logger);
             }
         }
-        persistent.clear();
     }
 
-    // Private method to reset an individual target logger.
-    private void resetLogger(Logger logger) {
-        // Close all the Logger's handlers.
+    private void closeHandlers(Logger logger) {
         Handler[] targets = logger.getHandlers();
         for (Handler h : targets) {
             logger.removeHandler(h);
@@ -1352,6 +1379,14 @@
                 // Problems closing a handler?  Keep going...
             }
         }
+    }
+
+    // Private method to reset an individual target logger.
+    private void resetLogger(Logger logger) {
+        // Close all the Logger handlers.
+        closeHandlers(logger);
+
+        // Reset Logger level
         String name = logger.getName();
         if (name != null && name.equals("")) {
             // This is the root logger.
@@ -1408,48 +1443,74 @@
      */
     public void readConfiguration(InputStream ins) throws IOException, SecurityException {
         checkPermission();
-        reset();
 
-        // Load the properties
+        // We don't want reset() and readConfiguration() to run
+        // in parallel.
+        configurationLock.lock();
         try {
-            props.load(ins);
-        } catch (IllegalArgumentException x) {
-            // props.load may throw an IllegalArgumentException if the stream
-            // contains malformed Unicode escape sequences.
-            // We wrap that in an IOException as readConfiguration is
-            // specified to throw IOException if there are problems reading
-            // from the stream.
-            // Note: new IOException(x.getMessage(), x) allow us to get a more
-            // concise error message than new IOException(x);
-            throw new IOException(x.getMessage(), x);
+            if (globalHandlersState == STATE_SHUTDOWN) {
+                // already in terminal state: don't even bother
+                // to read the configuration
+                return;
+            }
+
+            // change state to STATE_READING_CONFIG to signal reset() to not change it
+            globalHandlersState = STATE_READING_CONFIG;
+            try {
+                // reset configuration which leaves globalHandlersState at STATE_READING_CONFIG
+                // so that while reading configuration, any ongoing logging requests block and
+                // wait for the outcome (see the end of this try statement)
+                reset();
+
+                try {
+                    // Load the properties
+                    props.load(ins);
+                } catch (IllegalArgumentException x) {
+                    // props.load may throw an IllegalArgumentException if the stream
+                    // contains malformed Unicode escape sequences.
+                    // We wrap that in an IOException as readConfiguration is
+                    // specified to throw IOException if there are problems reading
+                    // from the stream.
+                    // Note: new IOException(x.getMessage(), x) allow us to get a more
+                    // concise error message than new IOException(x);
+                    throw new IOException(x.getMessage(), x);
+                }
+
+                // Instantiate new configuration objects.
+                String names[] = parseClassNames("config");
+
+                for (String word : names) {
+                    try {
+                        Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(word);
+                        clz.newInstance();
+                    } catch (Exception ex) {
+                        System.err.println("Can't load config class \"" + word + "\"");
+                        System.err.println("" + ex);
+                        // ex.printStackTrace();
+                    }
+                }
+
+                // Set levels on any pre-existing loggers, based on the new properties.
+                setLevelsOnExistingLoggers();
+
+                // Note that we need to reinitialize global handles when
+                // they are first referenced.
+                globalHandlersState = STATE_UNINITIALIZED;
+            } catch (Throwable t) {
+                // If there were any trouble, then set state to STATE_INITIALIZED
+                // so that no global handlers reinitialization is performed on not fully
+                // initialized configuration.
+                globalHandlersState = STATE_INITIALIZED;
+                // re-throw
+                throw t;
+            }
+        } finally {
+            configurationLock.unlock();
         }
 
-        // Instantiate new configuration objects.
-        String names[] = parseClassNames("config");
-
-        for (String word : names) {
-            try {
-                Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(word);
-                clz.newInstance();
-            } catch (Exception ex) {
-                System.err.println("Can't load config class \"" + word + "\"");
-                System.err.println("" + ex);
-                // ex.printStackTrace();
-            }
-        }
-
-        // Set levels on any pre-existing loggers, based on the new properties.
-        setLevelsOnExistingLoggers();
-
-        try {
-            invokeConfigurationListeners();
-        } finally {
-            // Note that we need to reinitialize global handles when
-            // they are first referenced.
-            synchronized (this) {
-                initializedGlobalHandlers = false;
-            }
-        }
+        // should be called out of lock to avoid dead-lock situations
+        // when user code is involved
+        invokeConfigurationListeners();
     }
 
     /**
@@ -1576,20 +1637,41 @@
     // Private method to load the global handlers.
     // We do the real work lazily, when the global handlers
     // are first used.
-    private synchronized void initializeGlobalHandlers() {
-        if (initializedGlobalHandlers) {
+    private void initializeGlobalHandlers() {
+        int state = globalHandlersState;
+        if (state == STATE_INITIALIZED ||
+            state == STATE_SHUTDOWN) {
+            // Nothing to do: return.
             return;
         }
 
-        initializedGlobalHandlers = true;
-
-        if (deathImminent) {
-            // Aaargh...
-            // The VM is shutting down and our exit hook has been called.
-            // Avoid allocating global handlers.
-            return;
+        // If we have not initialized global handlers yet (or need to
+        // reinitialize them), lets do it now (this case is indicated by
+        // globalHandlersState == STATE_UNINITIALIZED).
+        // If we are in the process of initializing global handlers we
+        // also need to lock & wait (this case is indicated by
+        // globalHandlersState == STATE_INITIALIZING).
+        // If we are in the process of reading configuration we also need to
+        // wait to see what the outcome will be (this case
+        // is indicated by globalHandlersState == STATE_READING_CONFIG)
+        // So in either case we need to wait for the lock.
+        configurationLock.lock();
+        try {
+            if (globalHandlersState != STATE_UNINITIALIZED) {
+                return; // recursive call or nothing to do
+            }
+            // set globalHandlersState to STATE_INITIALIZING first to avoid
+            // getting an infinite recursion when loadLoggerHandlers(...)
+            // is going to call addHandler(...)
+            globalHandlersState = STATE_INITIALIZING;
+            try {
+                loadLoggerHandlers(rootLogger, null, "handlers");
+            } finally {
+                globalHandlersState = STATE_INITIALIZED;
+            }
+        } finally {
+            configurationLock.unlock();
         }
-        loadLoggerHandlers(rootLogger, null, "handlers");
     }
 
     static final Permission controlPermission = new LoggingPermission("control", null);
@@ -1684,7 +1766,7 @@
 
     // Private method to be called when the configuration has
     // changed to apply any level settings to any pre-existing loggers.
-    synchronized private void setLevelsOnExistingLoggers() {
+    private void setLevelsOnExistingLoggers() {
         Enumeration<?> enum_ = props.propertyNames();
         while (enum_.hasMoreElements()) {
             String key = (String)enum_.nextElement();
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java	Tue May 19 11:40:00 2015 -0700
@@ -79,44 +79,46 @@
 
 /**
  *   <p>A converter between Java types and the limited set of classes
- *   defined by Open MBeans.</p>
+ *   defined by Open MBeans.
  *
- *   <p>A Java type is an instance of java.lang.reflect.Type.  For our
+ *   <p>A Java type is an instance of java.lang.reflect.Type. For our
  *   purposes, it is either a Class, such as String.class or int.class;
- *   or a ParameterizedType, such as List<String> or Map<Integer,
- *   String[]>.  On J2SE 1.4 and earlier, it can only be a Class.</p>
+ *   or a ParameterizedType, such as {@code List<String>} or
+ *   {@code Map<Integer, String[]>}.
+ *   On J2SE 1.4 and earlier, it can only be a Class.
  *
- *   <p>Each Type is associated with an DefaultMXBeanMappingFactory.  The
- *   DefaultMXBeanMappingFactory defines an OpenType corresponding to the Type, plus a
- *   Java class corresponding to the OpenType.  For example:</p>
+ *   <p>Each Type is associated with an DefaultMXBeanMappingFactory. The
+ *   DefaultMXBeanMappingFactory defines an
+ *   OpenType corresponding to the Type, plus a
+ *   Java class corresponding to the OpenType. For example:
  *
- *   <pre>
+ *   <pre>{@code
  *   Type                     Open class     OpenType
  *   ----                     ----------     --------
- *   Integer                Integer        SimpleType.INTEGER
- *   int                            int            SimpleType.INTEGER
- *   Integer[]              Integer[]      ArrayType(1, SimpleType.INTEGER)
- *   int[]                  Integer[]      ArrayType(SimpleType.INTEGER, true)
- *   String[][]             String[][]     ArrayType(2, SimpleType.STRING)
- *   List<String>                   String[]       ArrayType(1, SimpleType.STRING)
+ *   Integer                  Integer        SimpleType.INTEGER
+ *   int                      int            SimpleType.INTEGER
+ *   Integer[]                Integer[]      ArrayType(1, SimpleType.INTEGER)
+ *   int[]                    Integer[]      ArrayType(SimpleType.INTEGER, true)
+ *   String[][]               String[][]     ArrayType(2, SimpleType.STRING)
+ *   List<String>             String[]       ArrayType(1, SimpleType.STRING)
  *   ThreadState (an Enum)    String         SimpleType.STRING
- *   Map<Integer, String[]>   TabularData          TabularType(
+ *   Map<Integer, String[]>   TabularData    TabularType(
  *                                           CompositeType(
  *                                             {"key", SimpleType.INTEGER},
  *                                             {"value",
  *                                               ArrayType(1,
  *                                                SimpleType.STRING)}),
  *                                           indexNames={"key"})
- *   </pre>
+ *   }</pre>
  *
  *   <p>Apart from simple types, arrays, and collections, Java types are
  *   converted through introspection into CompositeType.  The Java type
  *   must have at least one getter (method such as "int getSize()" or
  *   "boolean isBig()"), and we must be able to deduce how to
  *   reconstruct an instance of the Java class from the values of the
- *   getters using one of various heuristics.</p>
+ *   getters using one of various heuristics.
  *
- * @since 1.6
+ *  @since 1.6
  */
 public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
     static abstract class NonNullMXBeanMapping extends MXBeanMapping {
@@ -148,8 +150,8 @@
         throws OpenDataException;
 
         /**
-         * <p>True if and only if this MXBeanMapping's toOpenValue and
-         * fromOpenValue methods are the identity function.</p>
+         * True if and only if this MXBeanMapping's toOpenValue and
+         * fromOpenValue methods are the identity function.
          */
         boolean isIdentity() {
             return false;
--- a/jdk/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java	Tue May 19 11:40:00 2015 -0700
@@ -57,8 +57,8 @@
      * <code>rspOutgoing</code> to inform that a response is sent out
      * for the received request.
      * @return the value of the termination flag:
-     * <ul><code>true</code> if the connection is already being terminated,
-     * <br><code>false</code> otherwise.</ul>
+     *         true if the connection is already being terminated,
+     *         false otherwise.
      */
     public boolean reqIncoming() {
         if (logger.traceOn()) {
@@ -80,8 +80,8 @@
     /**
      * Tells that a response is sent out for a received request.
      * @return the value of the termination flag:
-     * <ul><code>true</code> if the connection is already being terminated,
-     * <br><code>false</code> otherwise.</ul>
+     *         true if the connection is already being terminated,
+     *         false otherwise.
      */
     public boolean rspOutgoing() {
         if (logger.traceOn()) {
--- a/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/EnvHelp.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/EnvHelp.java	Tue May 19 11:40:00 2015 -0700
@@ -55,17 +55,17 @@
 public class EnvHelp {
 
     /**
-     * <p>Name of the attribute that specifies a default class loader
+     * Name of the attribute that specifies a default class loader
      * object.
-     * The value associated with this attribute is a ClassLoader object</p>
+     * The value associated with this attribute is a ClassLoader object.
      */
     private static final String DEFAULT_CLASS_LOADER =
         JMXConnectorFactory.DEFAULT_CLASS_LOADER;
 
     /**
-     * <p>Name of the attribute that specifies a default class loader
-     *    ObjectName.
-     * The value associated with this attribute is an ObjectName object</p>
+     * Name of the attribute that specifies a default class loader
+     * ObjectName.
+     * The value associated with this attribute is an ObjectName object.
      */
     private static final String DEFAULT_CLASS_LOADER_NAME =
         JMXConnectorServerFactory.DEFAULT_CLASS_LOADER_NAME;
@@ -74,7 +74,6 @@
      * Get the Connector Server default class loader.
      * <p>
      * Returns:
-     * <p>
      * <ul>
      * <li>
      *     The ClassLoader object found in <var>env</var> for
@@ -114,6 +113,7 @@
      *     <code>jmx.remote.default.class.loader.name</code> is specified
      *     but <var>mbs</var> is null.
      * </li>
+     * </ul>
      * @exception InstanceNotFoundException if
      * <code>jmx.remote.default.class.loader.name</code> is specified
      * and the ClassLoader MBean is not found in <var>mbs</var>.
@@ -172,7 +172,6 @@
      * Get the Connector Client default class loader.
      * <p>
      * Returns:
-     * <p>
      * <ul>
      * <li>
      *     The ClassLoader object found in <var>env</var> for
@@ -232,7 +231,7 @@
     /**
      * Returns the cause field of a {@code Throwable} object.
      * The cause field can be got only if <var>t</var> has an
-     * {@link Throwable#getCause()} method (JDK Version >= 1.4)
+     * {@link Throwable#getCause()} method (JDK Version {@literal >=} 1.4)
      * @param t {@code Throwable} on which the cause must be set.
      * @return the cause if getCause() succeeded and the got value is not
      * null, otherwise return the <var>t</var>.
@@ -254,7 +253,7 @@
 
 
     /**
-     * <p>Name of the attribute that specifies the size of a notification
+     * Name of the attribute that specifies the size of a notification
      * buffer for a connector server. The default value is 1000.
      */
     public static final String BUFFER_SIZE_PROPERTY =
@@ -316,10 +315,10 @@
     }
 
     /**
-     * <p>Name of the attribute that specifies the maximum number of
-     * notifications that a client will fetch from its server.. The
+     * Name of the attribute that specifies the maximum number of
+     * notifications that a client will fetch from its server. The
      * value associated with this attribute should be an
-     * <code>Integer</code> object.  The default value is 1000.</p>
+     * {@code Integer} object.  The default value is 1000.
      */
     public static final String MAX_FETCH_NOTIFS =
         "jmx.remote.x.notification.fetch.max";
@@ -334,10 +333,10 @@
     }
 
     /**
-     * <p>Name of the attribute that specifies the timeout for a
+     * Name of the attribute that specifies the timeout for a
      * client to fetch notifications from its server. The value
      * associated with this attribute should be a <code>Long</code>
-     * object.  The default value is 60000 milliseconds.</p>
+     * object.  The default value is 60000 milliseconds.
      */
     public static final String FETCH_TIMEOUT =
         "jmx.remote.x.notification.fetch.timeout";
@@ -351,11 +350,12 @@
     }
 
     /**
-     * <p>Name of the attribute that specifies an object that will check
+     * Name of the attribute that specifies an object that will check
      * accesses to add/removeNotificationListener and also attempts to
      * receive notifications.  The value associated with this attribute
      * should be a <code>NotificationAccessController</code> object.
-     * The default value is null.</p>
+     * The default value is null.
+     * <p>
      * This field is not public because of its com.sun dependency.
      */
     public static final String NOTIF_ACCESS_CONTROLLER =
@@ -630,9 +630,9 @@
     }
 
     /**
-     * <p>Name of the attribute that specifies the timeout to keep a
+     * Name of the attribute that specifies the timeout to keep a
      * server side connection after answering last client request.
-     * The default value is 120000 milliseconds.</p>
+     * The default value is 120000 milliseconds.
      */
     public static final String SERVER_CONNECTION_TIMEOUT =
         "jmx.remote.x.server.connection.timeout";
@@ -646,9 +646,9 @@
     }
 
     /**
-     * <p>Name of the attribute that specifies the period in
-     * millisecond for a client to check its connection.  The default
-     * value is 60000 milliseconds.</p>
+     * Name of the attribute that specifies the period in
+     * millisecond for a client to check its connection. The default
+     * value is 60000 milliseconds.
      */
     public static final String CLIENT_CONNECTION_CHECK_PERIOD =
         "jmx.remote.x.client.connection.check.period";
@@ -741,13 +741,13 @@
     }
 
     /**
-     * <p>Name of the attribute that specifies whether a connector server
+     * Name of the attribute that specifies whether a connector server
      * should not prevent the VM from exiting
      */
     public static final String JMX_SERVER_DAEMON = "jmx.remote.x.daemon";
 
     /**
-     * Returns true if {@value SERVER_DAEMON} is specified in the {@code env}
+     * Returns true if {@value JMX_SERVER_DAEMON} is specified in the {@code env}
      * as a key and its value is a String and it is equal to true ignoring case.
      *
      * @param env
--- a/jdk/src/java.management/share/classes/sun/management/HotspotRuntimeMBean.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/HotspotRuntimeMBean.java	Tue May 19 11:40:00 2015 -0700
@@ -64,7 +64,7 @@
      * Returns a list of internal counters maintained in the Java
      * virtual machine for the runtime system.
      *
-     * @return a <tt>List</tt> of internal counters maintained in the VM
+     * @return a {@code List} of internal counters maintained in the VM
      * for the runtime system.
      */
     public java.util.List<Counter> getInternalRuntimeCounters();
--- a/jdk/src/java.management/share/classes/sun/management/HotspotThreadMBean.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/HotspotThreadMBean.java	Tue May 19 11:40:00 2015 -0700
@@ -40,12 +40,11 @@
     public int getInternalThreadCount();
 
     /**
-     * Returns a <tt>Map</tt> of the name of all VM internal threads
+     * Returns a {@code Map} of the name of all VM internal threads
      * to the thread CPU time in nanoseconds.  The returned value is
      * of nanoseconds precision but not necessarily nanoseconds accuracy.
-     * <p>
      *
-     * @return a <tt>Map</tt> object of the name of all VM internal threads
+     * @return a {@code Map} object of the name of all VM internal threads
      * to the thread CPU time in nanoseconds.
      *
      * @throws java.lang.UnsupportedOperationException if the Java virtual
--- a/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java	Tue May 19 11:40:00 2015 -0700
@@ -45,13 +45,15 @@
  * A mapped mxbean type maps a Java type to an open type.
  * Only the following Java types are mappable
  * (currently required by the platform MXBeans):
- *   1. Primitive types
- *   2. Wrapper classes such java.lang.Integer, etc
- *   3. Classes with only getter methods and with a static "from" method
- *      that takes a CompositeData argument.
- *   4. E[] where E is a type of 1-4 (can be multi-dimensional array)
- *   5. List<E> where E is a type of 1-3
- *   6. Map<K, V> where K and V are a type of 1-4
+ * <ol>
+ *   <li>Primitive types</li>
+ *   <li>Wrapper classes such java.lang.Integer, etc</li>
+ *   <li>Classes with only getter methods and with a static "from" method
+ *      that takes a CompositeData argument.</li>
+ *   <li>{@code E[]} where {@code E} is a type of 1-4 (can be multi-dimensional array)</li>
+ *   <li>{@code List<E>} where E is a type of 1-3</li>
+ *   <li>{@code Map<K, V>} where {@code K} and {@code V} are a type of 1-4</li>
+ * </ol>
  *
  * OpenDataException will be thrown if a Java type is not supported.
  */
--- a/jdk/src/java.management/share/classes/sun/management/Sensor.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/Sensor.java	Tue May 19 11:40:00 2015 -0700
@@ -34,12 +34,12 @@
  * An abstract sensor.
  *
  * <p>
- * A <tt>AbstractSensor</tt> object consists of two attributes:
+ * A {@code AbstractSensor} object consists of two attributes:
  * <ul>
- *   <li><tt>on</tt> is a boolean flag indicating if a sensor is
+ *   <li>{@code on} is a boolean flag indicating if a sensor is
  *       triggered. This flag will be set or cleared by the
  *       component that owns the sensor.</li>
- *   <li><tt>count</tt> is the total number of times that a sensor
+ *   <li>{@code count} is the total number of times that a sensor
  *       has been triggered.</li>
  * </ul>
  *
@@ -54,7 +54,7 @@
     private boolean on;
 
     /**
-     * Constructs a <tt>Sensor</tt> object.
+     * Constructs a {@code Sensor} object.
      *
      * @param name The name of this sensor.
      */
@@ -88,8 +88,8 @@
     /**
      * Tests if this sensor is currently on.
      *
-     * @return <tt>true</tt> if the sensor is currently on;
-     *         <tt>false</tt> otherwise.
+     * @return {@code true} if the sensor is currently on;
+     *         {@code false} otherwise.
      *
      */
     public boolean isOn() {
@@ -112,7 +112,7 @@
 
     /**
      * Triggers this sensor. This method sets this sensor on
-     * and increments the count with the input <tt>increment</tt>.
+     * and increments the count with the input {@code increment}.
      */
     public void trigger(int increment) {
         synchronized (lock) {
@@ -126,7 +126,7 @@
     /**
      * Triggers this sensor piggybacking a memory usage object.
      * This method sets this sensor on
-     * and increments the count with the input <tt>increment</tt>.
+     * and increments the count with the input {@code increment}.
      */
     public void trigger(int increment, MemoryUsage usage) {
         synchronized (lock) {
@@ -150,7 +150,7 @@
 
     /**
      * Clears this sensor
-     * and increments the count with the input <tt>increment</tt>.
+     * and increments the count with the input {@code increment}.
      */
     public void clear(int increment) {
         synchronized (lock) {
--- a/jdk/src/java.management/share/classes/sun/management/counter/Counter.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/counter/Counter.java	Tue May 19 11:40:00 2015 -0700
@@ -63,7 +63,7 @@
     public Object getValue();
 
     /**
-     * Returns <tt>true</tt> if this counter is an internal counter.
+     * Returns {@code true} if this counter is an internal counter.
      */
     public boolean isInternal();
 
--- a/jdk/src/java.management/share/classes/sun/management/counter/perf/InstrumentationException.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/counter/perf/InstrumentationException.java	Tue May 19 11:40:00 2015 -0700
@@ -27,14 +27,14 @@
 
 public class InstrumentationException extends RuntimeException {
     /**
-     * Constructs a <tt>InstrumentationException</tt> with no
+     * Constructs a {@code InstrumentationException} with no
      * detail message.
      */
      public InstrumentationException() {
      }
 
     /**
-     * Constructs a <tt>InstrumentationException</tt> with a specified
+     * Constructs a {@code InstrumentationException} with a specified
      * detail message.
      *
      * @param message the detail message
--- a/jdk/src/java.management/share/classes/sun/management/jdp/JdpController.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/jdp/JdpController.java	Tue May 19 11:40:00 2015 -0700
@@ -37,19 +37,18 @@
 import sun.misc.ManagedLocalsThread;
 
 /**
- * JdpController is responsible to create and manage a broadcast loop
+ * JdpController is responsible to create and manage a broadcast loop.
  *
  * <p> Other part of code has no access to broadcast loop and have to use
  * provided static methods
  * {@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService}
- * and {@link #stopDiscoveryService() stopDiscoveryService}</p>
+ * and {@link #stopDiscoveryService() stopDiscoveryService}
  * <p>{@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService} could be called multiple
- * times as it stops the running service if it is necessary. Call to {@link #stopDiscoveryService() stopDiscoveryService}
- * ignored if service isn't run</p>
+ * times as it stops the running service if it is necessary.
+ * Call to {@link #stopDiscoveryService() stopDiscoveryService}
+ * ignored if service isn't run.
  *
  *
- * </p>
- *
  * <p> System properties below could be used to control broadcast loop behavior.
  * Property below have to be set explicitly in command line. It's not possible to
  * set it in management.config file.  Careless changes of these properties could
@@ -59,9 +58,9 @@
  *     <li>com.sun.management.jdp.pause       - set broadcast interval in seconds</li>
  *     <li>com.sun.management.jdp.source_addr - an address of interface to use for broadcast</li>
  * </ul>
-  </p>
+ *
  * <p>null parameters values are filtered out on {@link JdpPacketWriter} level and
- * corresponding keys are not placed to packet.</p>
+ * corresponding keys are not placed to packet.
  */
 public final class JdpController {
 
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BasicControl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BasicControl.java	Tue May 19 11:40:00 2015 -0700
@@ -28,7 +28,7 @@
 import javax.naming.ldap.*;
 
 /**
-  * This class provides a basic implementation of the <tt>Control</tt>
+  * This class provides a basic implementation of the {@code Control}
   * interface. It represents an LDAPv3 Control as defined in RFC-2251.
   *
   * @author Vincent Ryan
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java	Tue May 19 11:40:00 2015 -0700
@@ -295,7 +295,7 @@
      *          the relative parsed position is not returned.
      * @return A non-null array containing the octet string.
      * @throws DecodeException If the next byte in the BER buffer is not
-     * <tt>tag</tt>, or if length specified in the BER buffer exceeds the
+     * {@code tag}, or if length specified in the BER buffer exceeds the
      * number of bytes left in the buffer.
      */
     public byte[] parseOctetString(int tag, int rlen[]) throws DecodeException {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventQueue.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventQueue.java	Tue May 19 11:40:00 2015 -0700
@@ -73,16 +73,16 @@
     // package private;
     /**
      * Enqueue an event.
-     * @param event Either a <tt>NamingExceptionEvent</tt> or a subclass
-     *              of <tt>NamingEvent</tt> or
-     * <tt>UnsolicitedNotificationEvent</tt>.
-     * If it is a subclass of <tt>NamingEvent</tt>, all listeners must implement
-     * the corresponding subinterface of <tt>NamingListener</tt>.
-     * For example, for a <tt>ObjectAddedEvent</tt>, all listeners <em>must</em>
-     * implement the <tt>ObjectAddedListener</tt> interface.
+     * @param event Either a {@code NamingExceptionEvent} or a subclass
+     *        of {@code NamingEvent} or
+     *        {@code UnsolicitedNotificationEvent}.
+     * If it is a subclass of {@code NamingEvent}, all listeners must implement
+     * the corresponding subinterface of {@code NamingListener}.
+     * For example, for a {@code ObjectAddedEvent}, all listeners <em>must</em>
+     * implement the {@code ObjectAddedListener} interface.
      * <em>The current implementation does not check this before dispatching
      * the event.</em>
-     * If the event is a <tt>NamingExceptionEvent</tt>, then all listeners
+     * If the event is a {@code NamingExceptionEvent}, then all listeners
      * are notified.
      * @param vector List of NamingListeners that will be notified of event.
      */
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventSupport.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventSupport.java	Tue May 19 11:40:00 2015 -0700
@@ -55,14 +55,14 @@
  *<li>The filter (default is "(objectclass=*)").
  *<li>The search controls (default is null SearchControls).
  *<li>The events that the listener is interested in. This is determined by
- * finding out which <tt>NamingListener</tt> interface the listener supports.
+ * finding out which {@code NamingListener} interface the listener supports.
  *</ul>
  *<p>
- *A notifier (<tt>NamingEventNotifier</tt>) is a worker thread that is responsible
+ *A notifier ({@code NamingEventNotifier}) is a worker thread that is responsible
  *for gathering information for generating events requested by its listeners.
  *Each notifier maintains its own list of listeners; these listeners have
  *all made the same registration request (at different times) and implements
- *the same <tt>NamingListener</tt> interfaces.
+ *the same {@code NamingListener} interfaces.
  *<p>
  *For unsolicited listeners, this class maintains a vector, unsolicited.
  *When an unsolicited listener is registered, this class adds itself
@@ -93,7 +93,7 @@
  *The notifiers are responsible for gather information for generating events
  *requested by their respective listeners. When a notifier gets sufficient
  *information to generate an event, it creates invokes the
- *appropriate <tt>fireXXXEvent</tt> on this class with the information and list of
+ *appropriate {@code fireXXXEvent} on this class with the information and list of
  *listeners. This causes an event and the list of listeners to be added
  *to the <em>event queue</em>.
  *This class maintains an event queue and a dispatching thread that dequeues
@@ -138,7 +138,7 @@
     }
 
     /**
-     * Adds <tt>l</tt> to list of listeners interested in <tt>nm</tt>.
+     * Adds {@code l} to list of listeners interested in {@code nm}.
      */
     /*
      * Make the add/removeNamingListeners synchronized to:
@@ -173,7 +173,7 @@
     }
 
     /**
-     * Adds <tt>l</tt> to list of listeners interested in <tt>nm</tt>
+     * Adds {@code l} to list of listeners interested in {@code nm}
      * and filter.
      */
     synchronized void addNamingListener(String nm, String filter,
@@ -201,7 +201,7 @@
     }
 
     /**
-     * Removes <tt>l</tt> from all notifiers in this context.
+     * Removes {@code l} from all notifiers in this context.
      */
     synchronized void removeNamingListener(NamingListener l) {
         if (debug) System.err.println("EventSupport removing listener");
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java	Tue May 19 11:40:00 2015 -0700
@@ -336,7 +336,7 @@
      * characters:
      *<ul>
      *<li>leading and trailing whitespace
-     *<li><pre>, = + < > # ; " \</pre>
+     *<li><pre>{@literal , = + < > # ; " \}</pre>
      *</ul>
      * If the value is a byte array, it is converted to hex
      * notation (such as "#CEB1DF80").
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralException.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralException.java	Tue May 19 11:40:00 2015 -0700
@@ -35,7 +35,7 @@
   * This exception is raised when a referral to an alternative context
   * is encountered.
   * <p>
-  * An <tt>LdapReferralException</tt> object contains one or more referrals.
+  * An {@code LdapReferralException} object contains one or more referrals.
   * Each referral is an alternative location for the same target entry.
   * For example, a referral may be an LDAP URL.
   * The referrals are attempted in sequence until one is successful or
@@ -46,20 +46,20 @@
   * of an authentication error, a referral may be retried with different
   * environment properties.
   * <p>
-  * An <tt>LdapReferralException</tt> object may also contain a reference
-  * to a chain of unprocessed <tt>LdapReferralException</tt> objects.
+  * An {@code LdapReferralException} object may also contain a reference
+  * to a chain of unprocessed {@code LdapReferralException} objects.
   * Once the current set of referrals have been exhausted and unprocessed
-  * <tt>LdapReferralException</tt> objects remain, then the
-  * <tt>LdapReferralException</tt> object referenced by the current
+  * {@code LdapReferralException} objects remain, then the
+  * {@code LdapReferralException} object referenced by the current
   * object is thrown and the cycle continues.
   * <p>
-  * If new <tt>LdapReferralException</tt> objects are generated while
+  * If new {@code LdapReferralException} objects are generated while
   * following an existing referral then these new objects are appended
-  * to the end of the chain of unprocessed <tt>LdapReferralException</tt>
+  * to the end of the chain of unprocessed {@code LdapReferralException}
   * objects.
   * <p>
   * If an exception was recorded while processing a chain of
-  * <tt>LdapReferralException</tt> objects then it is throw once
+  * {@code LdapReferralException} objects then it is throw once
   * processing has completed.
   *
   * @author Vincent Ryan
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/UnsolicitedResponseImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/UnsolicitedResponseImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -65,7 +65,7 @@
       * Retrieves the object identifier of the response.
       *
       * @return A possibly null object identifier string representing the LDAP
-      *         <tt>ExtendedResponse.responseName</tt> component.
+      *         {@code ExtendedResponse.responseName} component.
       */
     public String getID() {
         return oid;
@@ -79,7 +79,7 @@
       * the response value. It does not include the response OID.
       *
       * @return A possibly null byte array representing the ASN.1 BER encoded
-      *         contents of the LDAP <tt>ExtendedResponse.response</tt>
+      *         contents of the LDAP {@code ExtendedResponse.response}
       *         component.
       */
     public byte[] getEncodedValue() {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/ext/StartTlsResponseImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/ext/StartTlsResponseImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -52,10 +52,10 @@
  * The object identifier for StartTLS is 1.3.6.1.4.1.1466.20037
  * and no extended response value is defined.
  *
- *<p>
+ * <p>
  * The Start TLS extended request and response are used to establish
  * a TLS connection over the existing LDAP connection associated with
- * the JNDI context on which <tt>extendedOperation()</tt> is invoked.
+ * the JNDI context on which {@code extendedOperation()} is invoked.
  *
  * @see StartTlsRequest
  * @author Vincent Ryan
@@ -124,7 +124,7 @@
     /**
      * Overrides the default list of cipher suites enabled for use on the
      * TLS connection. The cipher suites must have already been listed by
-     * <tt>SSLSocketFactory.getSupportedCipherSuites()</tt> as being supported.
+     * {@code SSLSocketFactory.getSupportedCipherSuites()} as being supported.
      * Even if a suite has been enabled, it still might not be used because
      * the peer does not support it, or because the requisite certificates
      * (and private keys) are not available.
@@ -140,12 +140,12 @@
     }
 
     /**
-     * Overrides the default hostname verifier used by <tt>negotiate()</tt>
+     * Overrides the default hostname verifier used by {@code negotiate()}
      * after the TLS handshake has completed. If
-     * <tt>setHostnameVerifier()</tt> has not been called before
-     * <tt>negotiate()</tt> is invoked, <tt>negotiate()</tt>
+     * {@code setHostnameVerifier()} has not been called before
+     * {@code negotiate()} is invoked, {@code negotiate()}
      * will perform a simple case ignore match. If called after
-     * <tt>negotiate()</tt>, this method does not do anything.
+     * {@code negotiate()}, this method does not do anything.
      *
      * @param verifier The non-null hostname verifier callback.
      * @see #negotiate
@@ -157,10 +157,10 @@
     /**
      * Negotiates a TLS session using the default SSL socket factory.
      * <p>
-     * This method is equivalent to <tt>negotiate(null)</tt>.
+     * This method is equivalent to {@code negotiate(null)}.
      *
      * @return The negotiated SSL session
-     * @throw IOException If an IO error was encountered while establishing
+     * @throws IOException If an IO error was encountered while establishing
      * the TLS session.
      * @see #setEnabledCipherSuites
      * @see #setHostnameVerifier
@@ -177,7 +177,7 @@
      * attaches it to the existing connection. Performs the TLS handshake
      * and returns the negotiated session information.
      * <p>
-     * If cipher suites have been set via <tt>setEnabledCipherSuites</tt>
+     * If cipher suites have been set via {@code setEnabledCipherSuites}
      * then they are enabled before the TLS handshake begins.
      * <p>
      * Hostname verification is performed after the TLS handshake completes.
@@ -186,7 +186,7 @@
      * hostname is extracted from the subjectAltName in the server's
      * certificate (if present). Otherwise the value of the common name
      * attribute of the subject name is used. If a callback has
-     * been set via <tt>setHostnameVerifier</tt> then that verifier is used if
+     * been set via {@code setHostnameVerifier} then that verifier is used if
      * the default check fails.
      * <p>
      * If an error occurs then the SSL socket is closed and an IOException
@@ -195,7 +195,7 @@
      * @param factory The possibly null SSL socket factory to use.
      * If null, the default SSL socket factory is used.
      * @return The negotiated SSL session
-     * @throw IOException If an IO error was encountered while establishing
+     * @throws IOException If an IO error was encountered while establishing
      * the TLS session.
      * @see #setEnabledCipherSuites
      * @see #setHostnameVerifier
@@ -252,7 +252,7 @@
      * Closes the TLS connection gracefully and reverts back to the underlying
      * connection.
      *
-     * @throw IOException If an IO error was encountered while closing the
+     * @throws IOException If an IO error was encountered while closing the
      * TLS connection
      */
     public void close() throws IOException {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/LdapSasl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/LdapSasl.java	Tue May 19 11:40:00 2015 -0700
@@ -72,12 +72,12 @@
      * property has not been set, Context.SECURITY_PRINCIPAL is used.
      * If SASL_CALLBACK has been set, use that instead of the default
      * CallbackHandler.
-     *<p>
+     * <p>
      * If bind is successful and the selected SASL mechanism has a security
      * layer, set inStream and outStream to be filter streams that use
      * the security layer. These will be used for subsequent communication
      * with the server.
-     *<p>
+     *
      * @param conn The non-null connection to use for sending an LDAP BIND
      * @param server Non-null string name of host to connect to
      * @param dn Non-null DN to bind as; also used as authentication ID
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java	Tue May 19 11:40:00 2015 -0700
@@ -329,7 +329,7 @@
      *<p>
      * After this method is called, isContinuing() returns true.
      *
-     * @param resObj The possibly null resolved object.
+     * @param obj The possibly null resolved object.
      * @param relResName The non-null resolved name relative to currCtx.
      * @param currCtx The non-null context from which relResName is to be resolved.
      */
@@ -349,7 +349,7 @@
      *<p>
      * After this method is called, isContinuing() returns true.
      *
-     * @param resObj The possibly null resolved object.
+     * @param obj The possibly null resolved object.
      * @param relResName The non-null resolved name relative to currCtx.
      * @param currCtx The non-null context from which relResName is to be resolved.
      * @param remain The non-null remaining name.
@@ -366,7 +366,7 @@
     /**
      * String overload.
      *
-     * @param resObj The possibly null resolved object.
+     * @param obj The possibly null resolved object.
      * @param relResName The non-null resolved name relative to currCtx.
      * @param currCtx The non-null context from which relResName is to be resolved.
      * @param remain The non-null remaining name.
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java	Tue May 19 11:40:00 2015 -0700
@@ -452,14 +452,14 @@
      * nonempty component, and if 'prefix' ends with an empty component or
      * 'name' starts with one, then one empty component is dropped.
      * For example:
-     * <pre>
+     * <pre>{@code
      *                            elideEmpty=false     elideEmpty=true
      * {"a"} + {"b"}          =>  {"a", "b"}           {"a", "b"}
      * {"a"} + {""}           =>  {"a", ""}            {"a", ""}
      * {"a"} + {"", "b"}      =>  {"a", "", "b"}       {"a", "b"}
      * {"a", ""} + {"b", ""}  =>  {"a", "", "b", ""}   {"a", "b", ""}
      * {"a", ""} + {"", "b"}  =>  {"a", "", "", "b"}   {"a", "", "b"}
-     * </pre>
+     * }</pre>
      */
     public Name composeName(Name name, Name prefix) throws NamingException {
         Name res = (Name)prefix.clone();
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/HierMemDirCtx.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/HierMemDirCtx.java	Tue May 19 11:40:00 2015 -0700
@@ -32,8 +32,8 @@
 /**
  * A sample service provider that implements a hierarchical directory in memory.
  * Every operation begins by doing a lookup on the name passed to it and then
- * calls a corresponding "do<OperationName>" on the result of the lookup. The
- * "do<OperationName>" does the work without any further resolution (it assumes
+ * calls a corresponding "{@code do<OperationName>}" on the result of the lookup. The
+ * "{@code do<OperationName>}" does the work without any further resolution (it assumes
  * that it is the target context).
  */
 
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java	Tue May 19 11:40:00 2015 -0700
@@ -548,8 +548,8 @@
 
 
     /**
-      * Finds the first occurrence of <tt>ch</tt> in <tt>val</tt> starting
-      * from position <tt>start</tt>. It doesn't count if <tt>ch</tt>
+      * Finds the first occurrence of {@code ch} in {@code val} starting
+      * from position {@code start}. It doesn't count if {@code ch}
       * has been escaped by a backslash (\)
       */
     public static int findUnescaped(char ch, String val, int start) {
@@ -568,8 +568,8 @@
     }
 
     /**
-     * Formats the expression <tt>expr</tt> using arguments from the array
-     * <tt>args</tt>.
+     * Formats the expression {@code expr} using arguments from the array
+     * {@code args}.
      *
      * <code>{i}</code> specifies the <code>i</code>'th element from
      * the array <code>args</code> is to be substituted for the
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java	Tue May 19 11:40:00 2015 -0700
@@ -107,12 +107,14 @@
       * the subclass must override getURLSuffix() to get the correct behavior.
       * Remember, the behavior must match getRootURLContext().
       *
+      * <pre>{@code
       * URL                                     Suffix
       * foo://host:port                         <empty string>
       * foo://host:port/rest/of/name            rest/of/name
       * foo:///rest/of/name                     rest/of/name
       * foo:/rest/of/name                       rest/of/name
       * foo:rest/of/name                        rest/of/name
+      * }</pre>
       */
     protected Name getURLSuffix(String prefix, String url) throws NamingException {
         String suffix = url.substring(prefix.length());
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/Uri.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/Uri.java	Tue May 19 11:40:00 2015 -0700
@@ -47,7 +47,7 @@
  * still run on pre-1.4 platforms not containing that class.
  *
  * <p> The format of an absolute URI (see the RFCs mentioned above) is:
- * <p><blockquote><pre>
+ * <blockquote><pre>{@code
  *      absoluteURI   = scheme ":" ( hier_part | opaque_part )
  *
  *      scheme        = alpha *( alpha | digit | "+" | "-" | "." )
@@ -94,12 +94,12 @@
  *      mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
  *      escaped       = "%" hex hex
  *      unwise        = "{" | "}" | "|" | "\" | "^" | "`"
- * </pre></blockquote>
+ * }</pre></blockquote>
  *
- * <p> Currently URIs containing <tt>userinfo</tt> or <tt>reg_name</tt>
+ * <p> Currently URIs containing {@code userinfo} or {@code reg_name}
  * are not supported.
- * The <tt>opaque_part</tt> of a non-hierarchical URI is treated as if
- * if were a <tt>path</tt> without a leading slash.
+ * The {@code opaque_part} of a non-hierarchical URI is treated as if
+ * if were a {@code path} without a leading slash.
  */
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  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 sun.security.provider.certpath.ldap;
+
+import java.util.HashMap;
+import java.util.List;
+import java.security.Provider;
+import java.security.NoSuchAlgorithmException;
+import java.security.InvalidParameterException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.ProviderException;
+import java.security.cert.CertStoreParameters;
+
+/**
+ * Provider class for the JdkLDAP provider.
+ * Supports LDAP cert store.
+ *
+ * @since   1.9
+ */
+public final class JdkLDAP extends Provider {
+
+    private static final long serialVersionUID = -2279741232933606418L;
+
+    private static final class ProviderService extends Provider.Service {
+        ProviderService(Provider p, String type, String algo, String cn,
+            List<String> aliases, HashMap<String, String> attrs) {
+            super(p, type, algo, cn, aliases, attrs);
+        }
+
+        @Override
+        public Object newInstance(Object ctrParamObj)
+            throws NoSuchAlgorithmException {
+            String type = getType();
+            String algo = getAlgorithm();
+            if (type.equals("CertStore") && algo.equals("LDAP")) {
+                if (ctrParamObj != null &&
+                    !(ctrParamObj instanceof CertStoreParameters)) {
+                    throw new InvalidParameterException
+                    ("constructorParameter must be instanceof CertStoreParameters");
+                }
+                try {
+                    return new LDAPCertStore((CertStoreParameters) ctrParamObj);
+                } catch (Exception ex) {
+                    throw new NoSuchAlgorithmException("Error constructing " +
+                        type + " for " + algo + " using JdkLDAP", ex);
+                }
+            }
+            throw new ProviderException("No impl for " + algo + " " + type);
+        }
+    }
+
+    public JdkLDAP() {
+        super("JdkLDAP", 1.9d, "JdkLDAP Provider (implements LDAP CertStore)");
+
+        HashMap<String, String> attrs = new HashMap<>(2);
+        attrs.put("LDAPSchema", "RFC2587");
+        attrs.put("ImplementedIn", "Software");
+
+        /*
+         * CertStore
+         * attrs: LDAPSchema, ImplementedIn
+         */
+        putService(new ProviderService(this, "CertStore",
+            "LDAP", "sun.security.provider.certpath.ldap.LDAPCertStore",
+            null, attrs));
+    }
+}
--- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,29 +25,15 @@
 
 package sun.security.provider.certpath.ldap;
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
 import java.math.BigInteger;
 import java.net.URI;
 import java.util.*;
-import javax.naming.Context;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.NameNotFoundException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.BasicAttributes;
 
 import java.security.*;
 import java.security.cert.Certificate;
 import java.security.cert.*;
-import javax.naming.CommunicationException;
-import javax.naming.ldap.InitialLdapContext;
-import javax.naming.ldap.LdapContext;
 import javax.security.auth.x500.X500Principal;
 
-import sun.misc.HexDumpEncoder;
-import sun.security.provider.certpath.X509CertificatePair;
 import sun.security.util.Cache;
 import sun.security.util.Debug;
 import sun.security.x509.X500Name;
@@ -109,480 +95,124 @@
 
     private final static boolean DEBUG = false;
 
-    /**
-     * LDAP attribute identifiers.
-     */
-    private static final String USER_CERT = "userCertificate;binary";
-    private static final String CA_CERT = "cACertificate;binary";
-    private static final String CROSS_CERT = "crossCertificatePair;binary";
-    private static final String CRL = "certificateRevocationList;binary";
-    private static final String ARL = "authorityRevocationList;binary";
-    private static final String DELTA_CRL = "deltaRevocationList;binary";
+    private String ldapDN;
+
+    private LDAPCertStoreImpl impl;
+
+    public LDAPCertStore(CertStoreParameters params)
+        throws InvalidAlgorithmParameterException {
+        super(params);
 
-    // Constants for various empty values
-    private final static String[] STRING0 = new String[0];
-
-    private final static byte[][] BB0 = new byte[0][];
-
-    private final static Attributes EMPTY_ATTRIBUTES = new BasicAttributes();
-
-    // cache related constants
-    private final static int DEFAULT_CACHE_SIZE = 750;
-    private final static int DEFAULT_CACHE_LIFETIME = 30;
+        String serverName;
+        int port;
+        String dn = null;
+        if (params == null) {
+            throw new InvalidAlgorithmParameterException(
+                "parameters required for LDAP Certore");
+        }
+        if (params instanceof LDAPCertStoreParameters) {
+            LDAPCertStoreParameters p = (LDAPCertStoreParameters) params;
+            serverName = p.getServerName();
+            port = p.getPort();
+        } else if (params instanceof URICertStoreParameters) {
+            URICertStoreParameters p = (URICertStoreParameters) params;
+            URI u = p.getURI();
+            if (!u.getScheme().equalsIgnoreCase("ldap")) {
+                throw new InvalidAlgorithmParameterException(
+                "Only LDAP URIs are supported for LDAP Certore");
+            }
+            // Use the same default values as in LDAPCertStoreParameters
+            // if unspecified in URI
+            serverName = u.getHost();
+            if (serverName == null) {
+                serverName = "localhost";
+            }
+            port = u.getPort();
+            if (port == -1) {
+                port = 389;
+            }
+            dn = u.getPath();
+            if (dn != null && dn.charAt(0) == '/') {
+                dn = dn.substring(1);
+            }
+        } else {
+            throw new InvalidAlgorithmParameterException(
+                "parameters must be either LDAPCertStoreParameters or " +
+                "URICertStoreParameters");
+        }
 
-    private final static int LIFETIME;
+        Key k = new Key(serverName, port);
+        LDAPCertStoreImpl lci = certStoreCache.get(k);
+        if (lci == null) {
+            this.impl = new LDAPCertStoreImpl(serverName, port);
+            certStoreCache.put(k, impl);
+        } else {
+            this.impl = lci;
+            if (debug != null) {
+                debug.println("LDAPCertStore.getInstance: cache hit");
+            }
+        }
+        this.ldapDN = dn;
+    }
 
-    private final static String PROP_LIFETIME =
-                            "sun.security.certpath.ldap.cache.lifetime";
+    private static class Key {
+        volatile int hashCode;
+
+        String serverName;
+        int port;
 
-    /*
-     * Internal system property, that when set to "true", disables the
-     * JNDI application resource files lookup to prevent recursion issues
-     * when validating signed JARs with LDAP URLs in certificates.
-     */
-    private final static String PROP_DISABLE_APP_RESOURCE_FILES =
-        "sun.security.certpath.ldap.disable.app.resource.files";
+        Key(String serverName, int port) {
+            this.serverName = serverName;
+            this.port = port;
+        }
 
-    static {
-        String s = AccessController.doPrivileged(
-            (PrivilegedAction<String>) () -> System.getProperty(PROP_LIFETIME));
-        if (s != null) {
-            LIFETIME = Integer.parseInt(s); // throws NumberFormatException
-        } else {
-            LIFETIME = DEFAULT_CACHE_LIFETIME;
+        @Override
+        public boolean equals(Object obj) {
+            if (!(obj instanceof Key)) {
+                return false;
+            }
+            Key key = (Key) obj;
+            return (port == key.port &&
+                serverName.equalsIgnoreCase(key.serverName));
+        }
+
+        @Override
+        public int hashCode() {
+            if (hashCode == 0) {
+                int result = 17;
+                result = 37*result + port;
+                result = 37*result +
+                    serverName.toLowerCase(Locale.ENGLISH).hashCode();
+                hashCode = result;
+            }
+            return hashCode;
         }
     }
 
     /**
-     * The CertificateFactory used to decode certificates from
-     * their binary stored form.
-     */
-    private CertificateFactory cf;
-    /**
-     * The JNDI directory context.
-     */
-    private LdapContext ctx;
-
-    /**
-     * Flag indicating that communication error occurred.
-     */
-    private boolean communicationError = false;
-
-    /**
-     * Flag indicating whether we should prefetch CRLs.
-     */
-    private boolean prefetchCRLs = false;
-
-    private final Cache<String, byte[][]> valueCache;
-
-    private int cacheHits = 0;
-    private int cacheMisses = 0;
-    private int requests = 0;
-
-    /**
-     * Creates a <code>CertStore</code> with the specified parameters.
-     * For this class, the parameters object must be an instance of
-     * <code>LDAPCertStoreParameters</code>.
-     *
-     * @param params the algorithm parameters
-     * @exception InvalidAlgorithmParameterException if params is not an
-     *   instance of <code>LDAPCertStoreParameters</code>
+     * Returns an LDAPCertStoreImpl object. This method consults a cache of
+     * LDAPCertStoreImpl objects (shared per JVM) using the corresponding
+     * LDAP server name and port info as a key.
      */
-    public LDAPCertStore(CertStoreParameters params)
-            throws InvalidAlgorithmParameterException {
-        super(params);
-        if (!(params instanceof LDAPCertStoreParameters))
-          throw new InvalidAlgorithmParameterException(
-            "parameters must be LDAPCertStoreParameters");
-
-        LDAPCertStoreParameters lparams = (LDAPCertStoreParameters) params;
-
-        // Create InitialDirContext needed to communicate with the server
-        createInitialDirContext(lparams.getServerName(), lparams.getPort());
+    private static final Cache<Key, LDAPCertStoreImpl>
+        certStoreCache = Cache.newSoftMemoryCache(185);
 
-        // Create CertificateFactory for use later on
-        try {
-            cf = CertificateFactory.getInstance("X.509");
-        } catch (CertificateException e) {
-            throw new InvalidAlgorithmParameterException(
-                "unable to create CertificateFactory for X.509");
-        }
-        if (LIFETIME == 0) {
-            valueCache = Cache.newNullCache();
-        } else if (LIFETIME < 0) {
-            valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE);
-        } else {
-            valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE, LIFETIME);
-        }
-    }
-
-    /**
-     * Returns an LDAP CertStore. This method consults a cache of
-     * CertStores (shared per JVM) using the LDAP server/port as a key.
-     */
-    private static final Cache<LDAPCertStoreParameters, CertStore>
-        certStoreCache = Cache.newSoftMemoryCache(185);
-    static synchronized CertStore getInstance(LDAPCertStoreParameters params)
+    // Exist solely for regression test for ensuring that caching is done
+    static synchronized LDAPCertStoreImpl getInstance(LDAPCertStoreParameters params)
         throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
-        // if necessary, convert params to SunLDAPCertStoreParameters because
-        // LDAPCertStoreParameters does not override equals() and hashCode()
-        if (! (params instanceof SunLDAPCertStoreParameters)) {
-            params = new SunLDAPCertStoreParameters(params.getServerName(), params.getPort());
-        }
-        CertStore lcs = certStoreCache.get(params);
-        if (lcs == null) {
-            lcs = CertStore.getInstance("LDAP", params);
-            certStoreCache.put(params, lcs);
+        String serverName = params.getServerName();
+        int port = params.getPort();
+        Key k = new Key(serverName, port);
+        LDAPCertStoreImpl lci = certStoreCache.get(k);
+        if (lci == null) {
+            lci = new LDAPCertStoreImpl(serverName, port);
+            certStoreCache.put(k, lci);
         } else {
             if (debug != null) {
                 debug.println("LDAPCertStore.getInstance: cache hit");
             }
         }
-        return lcs;
-    }
-
-    /**
-     * Create InitialDirContext.
-     *
-     * @param server Server DNS name hosting LDAP service
-     * @param port   Port at which server listens for requests
-     * @throws InvalidAlgorithmParameterException if creation fails
-     */
-    private void createInitialDirContext(String server, int port)
-            throws InvalidAlgorithmParameterException {
-        String url = "ldap://" + server + ":" + port;
-        Hashtable<String,Object> env = new Hashtable<>();
-        env.put(Context.INITIAL_CONTEXT_FACTORY,
-                "com.sun.jndi.ldap.LdapCtxFactory");
-        env.put(Context.PROVIDER_URL, url);
-
-        // If property is set to true, disable application resource file lookup.
-        boolean disableAppResourceFiles = AccessController.doPrivileged(
-            (PrivilegedAction<Boolean>) () -> Boolean.getBoolean(PROP_DISABLE_APP_RESOURCE_FILES));
-        if (disableAppResourceFiles) {
-            if (debug != null) {
-                debug.println("LDAPCertStore disabling app resource files");
-            }
-            env.put("com.sun.naming.disable.app.resource.files", "true");
-        }
-
-        try {
-            ctx = new InitialLdapContext(env, null);
-            /*
-             * By default, follow referrals unless application has
-             * overridden property in an application resource file.
-             */
-            Hashtable<?,?> currentEnv = ctx.getEnvironment();
-            if (currentEnv.get(Context.REFERRAL) == null) {
-                ctx.addToEnvironment(Context.REFERRAL, "follow");
-            }
-        } catch (NamingException e) {
-            if (debug != null) {
-                debug.println("LDAPCertStore.engineInit about to throw "
-                    + "InvalidAlgorithmParameterException");
-                e.printStackTrace();
-            }
-            Exception ee = new InvalidAlgorithmParameterException
-                ("unable to create InitialDirContext using supplied parameters");
-            ee.initCause(e);
-            throw (InvalidAlgorithmParameterException)ee;
-        }
-    }
-
-    /**
-     * Private class encapsulating the actual LDAP operations and cache
-     * handling. Use:
-     *
-     *   LDAPRequest request = new LDAPRequest(dn);
-     *   request.addRequestedAttribute(CROSS_CERT);
-     *   request.addRequestedAttribute(CA_CERT);
-     *   byte[][] crossValues = request.getValues(CROSS_CERT);
-     *   byte[][] caValues = request.getValues(CA_CERT);
-     *
-     * At most one LDAP request is sent for each instance created. If all
-     * getValues() calls can be satisfied from the cache, no request
-     * is sent at all. If a request is sent, all requested attributes
-     * are always added to the cache irrespective of whether the getValues()
-     * method is called.
-     */
-    private class LDAPRequest {
-
-        private final String name;
-        private Map<String, byte[][]> valueMap;
-        private final List<String> requestedAttributes;
-
-        LDAPRequest(String name) {
-            this.name = name;
-            requestedAttributes = new ArrayList<>(5);
-        }
-
-        String getName() {
-            return name;
-        }
-
-        void addRequestedAttribute(String attrId) {
-            if (valueMap != null) {
-                throw new IllegalStateException("Request already sent");
-            }
-            requestedAttributes.add(attrId);
-        }
-
-        /**
-         * Gets one or more binary values from an attribute.
-         *
-         * @param name          the location holding the attribute
-         * @param attrId                the attribute identifier
-         * @return                      an array of binary values (byte arrays)
-         * @throws NamingException      if a naming exception occurs
-         */
-        byte[][] getValues(String attrId) throws NamingException {
-            if (DEBUG && ((cacheHits + cacheMisses) % 50 == 0)) {
-                System.out.println("Cache hits: " + cacheHits + "; misses: "
-                        + cacheMisses);
-            }
-            String cacheKey = name + "|" + attrId;
-            byte[][] values = valueCache.get(cacheKey);
-            if (values != null) {
-                cacheHits++;
-                return values;
-            }
-            cacheMisses++;
-            Map<String, byte[][]> attrs = getValueMap();
-            values = attrs.get(attrId);
-            return values;
-        }
-
-        /**
-         * Get a map containing the values for this request. The first time
-         * this method is called on an object, the LDAP request is sent,
-         * the results parsed and added to a private map and also to the
-         * cache of this LDAPCertStore. Subsequent calls return the private
-         * map immediately.
-         *
-         * The map contains an entry for each requested attribute. The
-         * attribute name is the key, values are byte[][]. If there are no
-         * values for that attribute, values are byte[0][].
-         *
-         * @return                      the value Map
-         * @throws NamingException      if a naming exception occurs
-         */
-        private Map<String, byte[][]> getValueMap() throws NamingException {
-            if (valueMap != null) {
-                return valueMap;
-            }
-            if (DEBUG) {
-                System.out.println("Request: " + name + ":" + requestedAttributes);
-                requests++;
-                if (requests % 5 == 0) {
-                    System.out.println("LDAP requests: " + requests);
-                }
-            }
-            valueMap = new HashMap<>(8);
-            String[] attrIds = requestedAttributes.toArray(STRING0);
-            Attributes attrs;
-
-            if (communicationError) {
-                ctx.reconnect(null);
-                communicationError = false;
-            }
-
-            try {
-                attrs = ctx.getAttributes(name, attrIds);
-            } catch (CommunicationException ce) {
-                communicationError = true;
-                throw ce;
-            } catch (NameNotFoundException e) {
-                // name does not exist on this LDAP server
-                // treat same as not attributes found
-                attrs = EMPTY_ATTRIBUTES;
-            }
-            for (String attrId : requestedAttributes) {
-                Attribute attr = attrs.get(attrId);
-                byte[][] values = getAttributeValues(attr);
-                cacheAttribute(attrId, values);
-                valueMap.put(attrId, values);
-            }
-            return valueMap;
-        }
-
-        /**
-         * Add the values to the cache.
-         */
-        private void cacheAttribute(String attrId, byte[][] values) {
-            String cacheKey = name + "|" + attrId;
-            valueCache.put(cacheKey, values);
-        }
-
-        /**
-         * Get the values for the given attribute. If the attribute is null
-         * or does not contain any values, a zero length byte array is
-         * returned. NOTE that it is assumed that all values are byte arrays.
-         */
-        private byte[][] getAttributeValues(Attribute attr)
-                throws NamingException {
-            byte[][] values;
-            if (attr == null) {
-                values = BB0;
-            } else {
-                values = new byte[attr.size()][];
-                int i = 0;
-                NamingEnumeration<?> enum_ = attr.getAll();
-                while (enum_.hasMore()) {
-                    Object obj = enum_.next();
-                    if (debug != null) {
-                        if (obj instanceof String) {
-                            debug.println("LDAPCertStore.getAttrValues() "
-                                + "enum.next is a string!: " + obj);
-                        }
-                    }
-                    byte[] value = (byte[])obj;
-                    values[i++] = value;
-                }
-            }
-            return values;
-        }
-
-    }
-
-    /*
-     * Gets certificates from an attribute id and location in the LDAP
-     * directory. Returns a Collection containing only the Certificates that
-     * match the specified CertSelector.
-     *
-     * @param name the location holding the attribute
-     * @param id the attribute identifier
-     * @param sel a CertSelector that the Certificates must match
-     * @return a Collection of Certificates found
-     * @throws CertStoreException       if an exception occurs
-     */
-    private Collection<X509Certificate> getCertificates(LDAPRequest request,
-        String id, X509CertSelector sel) throws CertStoreException {
-
-        /* fetch encoded certs from storage */
-        byte[][] encodedCert;
-        try {
-            encodedCert = request.getValues(id);
-        } catch (NamingException namingEx) {
-            throw new CertStoreException(namingEx);
-        }
-
-        int n = encodedCert.length;
-        if (n == 0) {
-            return Collections.emptySet();
-        }
-
-        List<X509Certificate> certs = new ArrayList<>(n);
-        /* decode certs and check if they satisfy selector */
-        for (int i = 0; i < n; i++) {
-            ByteArrayInputStream bais = new ByteArrayInputStream(encodedCert[i]);
-            try {
-                Certificate cert = cf.generateCertificate(bais);
-                if (sel.match(cert)) {
-                  certs.add((X509Certificate)cert);
-                }
-            } catch (CertificateException e) {
-                if (debug != null) {
-                    debug.println("LDAPCertStore.getCertificates() encountered "
-                        + "exception while parsing cert, skipping the bad data: ");
-                    HexDumpEncoder encoder = new HexDumpEncoder();
-                    debug.println(
-                        "[ " + encoder.encodeBuffer(encodedCert[i]) + " ]");
-                }
-            }
-        }
-
-        return certs;
-    }
-
-    /*
-     * Gets certificate pairs from an attribute id and location in the LDAP
-     * directory.
-     *
-     * @param name the location holding the attribute
-     * @param id the attribute identifier
-     * @return a Collection of X509CertificatePairs found
-     * @throws CertStoreException       if an exception occurs
-     */
-    private Collection<X509CertificatePair> getCertPairs(
-        LDAPRequest request, String id) throws CertStoreException {
-
-        /* fetch the encoded cert pairs from storage */
-        byte[][] encodedCertPair;
-        try {
-            encodedCertPair = request.getValues(id);
-        } catch (NamingException namingEx) {
-            throw new CertStoreException(namingEx);
-        }
-
-        int n = encodedCertPair.length;
-        if (n == 0) {
-            return Collections.emptySet();
-        }
-
-        List<X509CertificatePair> certPairs = new ArrayList<>(n);
-        /* decode each cert pair and add it to the Collection */
-        for (int i = 0; i < n; i++) {
-            try {
-                X509CertificatePair certPair =
-                    X509CertificatePair.generateCertificatePair(encodedCertPair[i]);
-                certPairs.add(certPair);
-            } catch (CertificateException e) {
-                if (debug != null) {
-                    debug.println(
-                        "LDAPCertStore.getCertPairs() encountered exception "
-                        + "while parsing cert, skipping the bad data: ");
-                    HexDumpEncoder encoder = new HexDumpEncoder();
-                    debug.println(
-                        "[ " + encoder.encodeBuffer(encodedCertPair[i]) + " ]");
-                }
-            }
-        }
-
-        return certPairs;
-    }
-
-    /*
-     * Looks at certificate pairs stored in the crossCertificatePair attribute
-     * at the specified location in the LDAP directory. Returns a Collection
-     * containing all Certificates stored in the forward component that match
-     * the forward CertSelector and all Certificates stored in the reverse
-     * component that match the reverse CertSelector.
-     * <p>
-     * If either forward or reverse is null, all certificates from the
-     * corresponding component will be rejected.
-     *
-     * @param name the location to look in
-     * @param forward the forward CertSelector (or null)
-     * @param reverse the reverse CertSelector (or null)
-     * @return a Collection of Certificates found
-     * @throws CertStoreException       if an exception occurs
-     */
-    private Collection<X509Certificate> getMatchingCrossCerts(
-            LDAPRequest request, X509CertSelector forward,
-            X509CertSelector reverse)
-            throws CertStoreException {
-        // Get the cert pairs
-        Collection<X509CertificatePair> certPairs =
-                                getCertPairs(request, CROSS_CERT);
-
-        // Find Certificates that match and put them in a list
-        ArrayList<X509Certificate> matchingCerts = new ArrayList<>();
-        for (X509CertificatePair certPair : certPairs) {
-            X509Certificate cert;
-            if (forward != null) {
-                cert = certPair.getForward();
-                if ((cert != null) && forward.match(cert)) {
-                    matchingCerts.add(cert);
-                }
-            }
-            if (reverse != null) {
-                cert = certPair.getReverse();
-                if ((cert != null) && reverse.match(cert)) {
-                    matchingCerts.add(cert);
-                }
-            }
-        }
-        return matchingCerts;
+        return lci;
     }
 
     /**
@@ -612,159 +242,12 @@
             debug.println("LDAPCertStore.engineGetCertificates() selector: "
                 + String.valueOf(selector));
         }
-
         if (selector == null) {
             selector = new X509CertSelector();
-        }
-        if (!(selector instanceof X509CertSelector)) {
-            throw new CertStoreException("LDAPCertStore needs an X509CertSelector " +
-                                         "to find certs");
-        }
-        X509CertSelector xsel = (X509CertSelector) selector;
-        int basicConstraints = xsel.getBasicConstraints();
-        String subject = xsel.getSubjectAsString();
-        String issuer = xsel.getIssuerAsString();
-        HashSet<X509Certificate> certs = new HashSet<>();
-        if (debug != null) {
-            debug.println("LDAPCertStore.engineGetCertificates() basicConstraints: "
-                + basicConstraints);
-        }
-
-        // basicConstraints:
-        // -2: only EE certs accepted
-        // -1: no check is done
-        //  0: any CA certificate accepted
-        // >1: certificate's basicConstraints extension pathlen must match
-        if (subject != null) {
-            if (debug != null) {
-                debug.println("LDAPCertStore.engineGetCertificates() "
-                    + "subject is not null");
-            }
-            LDAPRequest request = new LDAPRequest(subject);
-            if (basicConstraints > -2) {
-                request.addRequestedAttribute(CROSS_CERT);
-                request.addRequestedAttribute(CA_CERT);
-                request.addRequestedAttribute(ARL);
-                if (prefetchCRLs) {
-                    request.addRequestedAttribute(CRL);
-                }
-            }
-            if (basicConstraints < 0) {
-                request.addRequestedAttribute(USER_CERT);
-            }
-
-            if (basicConstraints > -2) {
-                certs.addAll(getMatchingCrossCerts(request, xsel, null));
-                if (debug != null) {
-                    debug.println("LDAPCertStore.engineGetCertificates() after "
-                        + "getMatchingCrossCerts(subject,xsel,null),certs.size(): "
-                        + certs.size());
-                }
-                certs.addAll(getCertificates(request, CA_CERT, xsel));
-                if (debug != null) {
-                    debug.println("LDAPCertStore.engineGetCertificates() after "
-                        + "getCertificates(subject,CA_CERT,xsel),certs.size(): "
-                        + certs.size());
-                }
-            }
-            if (basicConstraints < 0) {
-                certs.addAll(getCertificates(request, USER_CERT, xsel));
-                if (debug != null) {
-                    debug.println("LDAPCertStore.engineGetCertificates() after "
-                        + "getCertificates(subject,USER_CERT, xsel),certs.size(): "
-                        + certs.size());
-                }
-            }
-        } else {
-            if (debug != null) {
-                debug.println
-                    ("LDAPCertStore.engineGetCertificates() subject is null");
-            }
-            if (basicConstraints == -2) {
-                throw new CertStoreException("need subject to find EE certs");
-            }
-            if (issuer == null) {
-                throw new CertStoreException("need subject or issuer to find certs");
-            }
+        } else if (!(selector instanceof X509CertSelector)) {
+            throw new CertStoreException("need X509CertSelector to find certs");
         }
-        if (debug != null) {
-            debug.println("LDAPCertStore.engineGetCertificates() about to "
-                + "getMatchingCrossCerts...");
-        }
-        if ((issuer != null) && (basicConstraints > -2)) {
-            LDAPRequest request = new LDAPRequest(issuer);
-            request.addRequestedAttribute(CROSS_CERT);
-            request.addRequestedAttribute(CA_CERT);
-            request.addRequestedAttribute(ARL);
-            if (prefetchCRLs) {
-                request.addRequestedAttribute(CRL);
-            }
-
-            certs.addAll(getMatchingCrossCerts(request, null, xsel));
-            if (debug != null) {
-                debug.println("LDAPCertStore.engineGetCertificates() after "
-                    + "getMatchingCrossCerts(issuer,null,xsel),certs.size(): "
-                    + certs.size());
-            }
-            certs.addAll(getCertificates(request, CA_CERT, xsel));
-            if (debug != null) {
-                debug.println("LDAPCertStore.engineGetCertificates() after "
-                    + "getCertificates(issuer,CA_CERT,xsel),certs.size(): "
-                    + certs.size());
-            }
-        }
-        if (debug != null) {
-            debug.println("LDAPCertStore.engineGetCertificates() returning certs");
-        }
-        return certs;
-    }
-
-    /*
-     * Gets CRLs from an attribute id and location in the LDAP directory.
-     * Returns a Collection containing only the CRLs that match the
-     * specified CRLSelector.
-     *
-     * @param name the location holding the attribute
-     * @param id the attribute identifier
-     * @param sel a CRLSelector that the CRLs must match
-     * @return a Collection of CRLs found
-     * @throws CertStoreException       if an exception occurs
-     */
-    private Collection<X509CRL> getCRLs(LDAPRequest request, String id,
-            X509CRLSelector sel) throws CertStoreException {
-
-        /* fetch the encoded crls from storage */
-        byte[][] encodedCRL;
-        try {
-            encodedCRL = request.getValues(id);
-        } catch (NamingException namingEx) {
-            throw new CertStoreException(namingEx);
-        }
-
-        int n = encodedCRL.length;
-        if (n == 0) {
-            return Collections.emptySet();
-        }
-
-        List<X509CRL> crls = new ArrayList<>(n);
-        /* decode each crl and check if it matches selector */
-        for (int i = 0; i < n; i++) {
-            try {
-                CRL crl = cf.generateCRL(new ByteArrayInputStream(encodedCRL[i]));
-                if (sel.match(crl)) {
-                    crls.add((X509CRL)crl);
-                }
-            } catch (CRLException e) {
-                if (debug != null) {
-                    debug.println("LDAPCertStore.getCRLs() encountered exception"
-                        + " while parsing CRL, skipping the bad data: ");
-                    HexDumpEncoder encoder = new HexDumpEncoder();
-                    debug.println("[ " + encoder.encodeBuffer(encodedCRL[i]) + " ]");
-                }
-            }
-        }
-
-        return crls;
+        return impl.getCertificates((X509CertSelector) selector, ldapDN);
     }
 
     /**
@@ -797,314 +280,9 @@
         // Set up selector and collection to hold CRLs
         if (selector == null) {
             selector = new X509CRLSelector();
-        }
-        if (!(selector instanceof X509CRLSelector)) {
+        } else if (!(selector instanceof X509CRLSelector)) {
             throw new CertStoreException("need X509CRLSelector to find CRLs");
         }
-        X509CRLSelector xsel = (X509CRLSelector) selector;
-        HashSet<X509CRL> crls = new HashSet<>();
-
-        // Look in directory entry for issuer of cert we're checking.
-        Collection<Object> issuerNames;
-        X509Certificate certChecking = xsel.getCertificateChecking();
-        if (certChecking != null) {
-            issuerNames = new HashSet<>();
-            X500Principal issuer = certChecking.getIssuerX500Principal();
-            issuerNames.add(issuer.getName(X500Principal.RFC2253));
-        } else {
-            // But if we don't know which cert we're checking, try the directory
-            // entries of all acceptable CRL issuers
-            issuerNames = xsel.getIssuerNames();
-            if (issuerNames == null) {
-                throw new CertStoreException("need issuerNames or certChecking to "
-                    + "find CRLs");
-            }
-        }
-        for (Object nameObject : issuerNames) {
-            String issuerName;
-            if (nameObject instanceof byte[]) {
-                try {
-                    X500Principal issuer = new X500Principal((byte[])nameObject);
-                    issuerName = issuer.getName(X500Principal.RFC2253);
-                } catch (IllegalArgumentException e) {
-                    continue;
-                }
-            } else {
-                issuerName = (String)nameObject;
-            }
-            // If all we want is CA certs, try to get the (probably shorter) ARL
-            Collection<X509CRL> entryCRLs = Collections.emptySet();
-            if (certChecking == null || certChecking.getBasicConstraints() != -1) {
-                LDAPRequest request = new LDAPRequest(issuerName);
-                request.addRequestedAttribute(CROSS_CERT);
-                request.addRequestedAttribute(CA_CERT);
-                request.addRequestedAttribute(ARL);
-                if (prefetchCRLs) {
-                    request.addRequestedAttribute(CRL);
-                }
-                try {
-                    entryCRLs = getCRLs(request, ARL, xsel);
-                    if (entryCRLs.isEmpty()) {
-                        // no ARLs found. We assume that means that there are
-                        // no ARLs on this server at all and prefetch the CRLs.
-                        prefetchCRLs = true;
-                    } else {
-                        crls.addAll(entryCRLs);
-                    }
-                } catch (CertStoreException e) {
-                    if (debug != null) {
-                        debug.println("LDAPCertStore.engineGetCRLs non-fatal error "
-                            + "retrieving ARLs:" + e);
-                        e.printStackTrace();
-                    }
-                }
-            }
-            // Otherwise, get the CRL
-            // if certChecking is null, we don't know if we should look in ARL or CRL
-            // attribute, so check both for matching CRLs.
-            if (entryCRLs.isEmpty() || certChecking == null) {
-                LDAPRequest request = new LDAPRequest(issuerName);
-                request.addRequestedAttribute(CRL);
-                entryCRLs = getCRLs(request, CRL, xsel);
-                crls.addAll(entryCRLs);
-            }
-        }
-        return crls;
-    }
-
-    // converts an LDAP URI into LDAPCertStoreParameters
-    static LDAPCertStoreParameters getParameters(URI uri) {
-        String host = uri.getHost();
-        if (host == null) {
-            return new SunLDAPCertStoreParameters();
-        } else {
-            int port = uri.getPort();
-            return (port == -1
-                    ? new SunLDAPCertStoreParameters(host)
-                    : new SunLDAPCertStoreParameters(host, port));
-        }
-    }
-
-    /*
-     * Subclass of LDAPCertStoreParameters with overridden equals/hashCode
-     * methods. This is necessary because the parameters are used as
-     * keys in the LDAPCertStore cache.
-     */
-    private static class SunLDAPCertStoreParameters
-        extends LDAPCertStoreParameters {
-
-        private volatile int hashCode = 0;
-
-        SunLDAPCertStoreParameters(String serverName, int port) {
-            super(serverName, port);
-        }
-        SunLDAPCertStoreParameters(String serverName) {
-            super(serverName);
-        }
-        SunLDAPCertStoreParameters() {
-            super();
-        }
-        @Override
-        public boolean equals(Object obj) {
-            if (obj == null) {
-                return false;
-            }
-
-            if (!(obj instanceof LDAPCertStoreParameters)) {
-                return false;
-            }
-            LDAPCertStoreParameters params = (LDAPCertStoreParameters) obj;
-            return (getPort() == params.getPort() &&
-                    getServerName().equalsIgnoreCase(params.getServerName()));
-        }
-        @Override
-        public int hashCode() {
-            if (hashCode == 0) {
-                int result = 17;
-                result = 37*result + getPort();
-                result = 37*result +
-                    getServerName().toLowerCase(Locale.ENGLISH).hashCode();
-                hashCode = result;
-            }
-            return hashCode;
-        }
-    }
-
-    /*
-     * This inner class wraps an existing X509CertSelector and adds
-     * additional criteria to match on when the certificate's subject is
-     * different than the LDAP Distinguished Name entry. The LDAPCertStore
-     * implementation uses the subject DN as the directory entry for
-     * looking up certificates. This can be problematic if the certificates
-     * that you want to fetch have a different subject DN than the entry
-     * where they are stored. You could set the selector's subject to the
-     * LDAP DN entry, but then the resulting match would fail to find the
-     * desired certificates because the subject DNs would not match. This
-     * class avoids that problem by introducing a certSubject which should
-     * be set to the certificate's subject DN when it is different than
-     * the LDAP DN.
-     */
-    static class LDAPCertSelector extends X509CertSelector {
-
-        private X500Principal certSubject;
-        private X509CertSelector selector;
-        private X500Principal subject;
-
-        /**
-         * Creates an LDAPCertSelector.
-         *
-         * @param selector the X509CertSelector to wrap
-         * @param certSubject the subject DN of the certificate that you want
-         *      to retrieve via LDAP
-         * @param ldapDN the LDAP DN where the certificate is stored
-         */
-        LDAPCertSelector(X509CertSelector selector, X500Principal certSubject,
-            String ldapDN) throws IOException {
-            this.selector = selector == null ? new X509CertSelector() : selector;
-            this.certSubject = certSubject;
-            this.subject = new X500Name(ldapDN).asX500Principal();
-        }
-
-        // we only override the get (accessor methods) since the set methods
-        // will not be invoked by the code that uses this LDAPCertSelector.
-        public X509Certificate getCertificate() {
-            return selector.getCertificate();
-        }
-        public BigInteger getSerialNumber() {
-            return selector.getSerialNumber();
-        }
-        public X500Principal getIssuer() {
-            return selector.getIssuer();
-        }
-        public String getIssuerAsString() {
-            return selector.getIssuerAsString();
-        }
-        public byte[] getIssuerAsBytes() throws IOException {
-            return selector.getIssuerAsBytes();
-        }
-        public X500Principal getSubject() {
-            // return the ldap DN
-            return subject;
-        }
-        public String getSubjectAsString() {
-            // return the ldap DN
-            return subject.getName();
-        }
-        public byte[] getSubjectAsBytes() throws IOException {
-            // return the encoded ldap DN
-            return subject.getEncoded();
-        }
-        public byte[] getSubjectKeyIdentifier() {
-            return selector.getSubjectKeyIdentifier();
-        }
-        public byte[] getAuthorityKeyIdentifier() {
-            return selector.getAuthorityKeyIdentifier();
-        }
-        public Date getCertificateValid() {
-            return selector.getCertificateValid();
-        }
-        public Date getPrivateKeyValid() {
-            return selector.getPrivateKeyValid();
-        }
-        public String getSubjectPublicKeyAlgID() {
-            return selector.getSubjectPublicKeyAlgID();
-        }
-        public PublicKey getSubjectPublicKey() {
-            return selector.getSubjectPublicKey();
-        }
-        public boolean[] getKeyUsage() {
-            return selector.getKeyUsage();
-        }
-        public Set<String> getExtendedKeyUsage() {
-            return selector.getExtendedKeyUsage();
-        }
-        public boolean getMatchAllSubjectAltNames() {
-            return selector.getMatchAllSubjectAltNames();
-        }
-        public Collection<List<?>> getSubjectAlternativeNames() {
-            return selector.getSubjectAlternativeNames();
-        }
-        public byte[] getNameConstraints() {
-            return selector.getNameConstraints();
-        }
-        public int getBasicConstraints() {
-            return selector.getBasicConstraints();
-        }
-        public Set<String> getPolicy() {
-            return selector.getPolicy();
-        }
-        public Collection<List<?>> getPathToNames() {
-            return selector.getPathToNames();
-        }
-
-        public boolean match(Certificate cert) {
-            // temporarily set the subject criterion to the certSubject
-            // so that match will not reject the desired certificates
-            selector.setSubject(certSubject);
-            boolean match = selector.match(cert);
-            selector.setSubject(subject);
-            return match;
-        }
-    }
-
-    /**
-     * This class has the same purpose as LDAPCertSelector except it is for
-     * X.509 CRLs.
-     */
-    static class LDAPCRLSelector extends X509CRLSelector {
-
-        private X509CRLSelector selector;
-        private Collection<X500Principal> certIssuers;
-        private Collection<X500Principal> issuers;
-        private HashSet<Object> issuerNames;
-
-        /**
-         * Creates an LDAPCRLSelector.
-         *
-         * @param selector the X509CRLSelector to wrap
-         * @param certIssuers the issuer DNs of the CRLs that you want
-         *      to retrieve via LDAP
-         * @param ldapDN the LDAP DN where the CRL is stored
-         */
-        LDAPCRLSelector(X509CRLSelector selector,
-            Collection<X500Principal> certIssuers, String ldapDN)
-            throws IOException {
-            this.selector = selector == null ? new X509CRLSelector() : selector;
-            this.certIssuers = certIssuers;
-            issuerNames = new HashSet<>();
-            issuerNames.add(ldapDN);
-            issuers = new HashSet<>();
-            issuers.add(new X500Name(ldapDN).asX500Principal());
-        }
-        // we only override the get (accessor methods) since the set methods
-        // will not be invoked by the code that uses this LDAPCRLSelector.
-        public Collection<X500Principal> getIssuers() {
-            // return the ldap DN
-            return Collections.unmodifiableCollection(issuers);
-        }
-        public Collection<Object> getIssuerNames() {
-            // return the ldap DN
-            return Collections.unmodifiableCollection(issuerNames);
-        }
-        public BigInteger getMinCRL() {
-            return selector.getMinCRL();
-        }
-        public BigInteger getMaxCRL() {
-            return selector.getMaxCRL();
-        }
-        public Date getDateAndTime() {
-            return selector.getDateAndTime();
-        }
-        public X509Certificate getCertificateChecking() {
-            return selector.getCertificateChecking();
-        }
-        public boolean match(CRL crl) {
-            // temporarily set the issuer criterion to the certIssuers
-            // so that match will not reject the desired CRL
-            selector.setIssuers(certIssuers);
-            boolean match = selector.match(crl);
-            selector.setIssuers(issuers);
-            return match;
-        }
+        return impl.getCRLs((X509CRLSelector) selector, ldapDN);
     }
 }
--- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStoreHelper.java	Thu May 14 12:05:33 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2009, 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.
- */
-
-package sun.security.provider.certpath.ldap;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.Collection;
-import java.security.NoSuchAlgorithmException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.cert.CertStore;
-import java.security.cert.CertStoreException;
-import java.security.cert.X509CertSelector;
-import java.security.cert.X509CRLSelector;
-import javax.naming.CommunicationException;
-import javax.naming.ServiceUnavailableException;
-import javax.security.auth.x500.X500Principal;
-
-import sun.security.provider.certpath.CertStoreHelper;
-
-/**
- * LDAP implementation of CertStoreHelper.
- */
-
-public final class LDAPCertStoreHelper
-    extends CertStoreHelper
-{
-    @Override
-    public CertStore getCertStore(URI uri)
-        throws NoSuchAlgorithmException, InvalidAlgorithmParameterException
-    {
-        return LDAPCertStore.getInstance(LDAPCertStore.getParameters(uri));
-    }
-
-    @Override
-    public X509CertSelector wrap(X509CertSelector selector,
-                                 X500Principal certSubject,
-                                 String ldapDN)
-        throws IOException
-    {
-        return new LDAPCertStore.LDAPCertSelector(selector, certSubject, ldapDN);
-    }
-
-    @Override
-    public X509CRLSelector wrap(X509CRLSelector selector,
-                                Collection<X500Principal> certIssuers,
-                                String ldapDN)
-        throws IOException
-    {
-        return new LDAPCertStore.LDAPCRLSelector(selector, certIssuers, ldapDN);
-    }
-
-    @Override
-    public boolean isCausedByNetworkIssue(CertStoreException e) {
-        Throwable t = e.getCause();
-        return (t != null && (t instanceof ServiceUnavailableException ||
-                              t instanceof CommunicationException));
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStoreImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,772 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  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 sun.security.provider.certpath.ldap;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.*;
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.NameNotFoundException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttributes;
+
+import java.security.*;
+import java.security.cert.Certificate;
+import java.security.cert.*;
+import javax.naming.CommunicationException;
+import javax.naming.ldap.InitialLdapContext;
+import javax.naming.ldap.LdapContext;
+import javax.security.auth.x500.X500Principal;
+
+import sun.misc.HexDumpEncoder;
+import sun.security.provider.certpath.X509CertificatePair;
+import sun.security.util.Cache;
+import sun.security.util.Debug;
+import sun.security.x509.X500Name;
+
+/**
+ * Core implementation of a LDAP Cert Store.
+ * @see java.security.cert.CertStore
+ *
+ * @since       1.9
+ */
+final class LDAPCertStoreImpl {
+
+    private static final Debug debug = Debug.getInstance("certpath");
+
+    private final static boolean DEBUG = false;
+
+    /**
+     * LDAP attribute identifiers.
+     */
+    private static final String USER_CERT = "userCertificate;binary";
+    private static final String CA_CERT = "cACertificate;binary";
+    private static final String CROSS_CERT = "crossCertificatePair;binary";
+    private static final String CRL = "certificateRevocationList;binary";
+    private static final String ARL = "authorityRevocationList;binary";
+    private static final String DELTA_CRL = "deltaRevocationList;binary";
+
+    // Constants for various empty values
+    private final static String[] STRING0 = new String[0];
+
+    private final static byte[][] BB0 = new byte[0][];
+
+    private final static Attributes EMPTY_ATTRIBUTES = new BasicAttributes();
+
+    // cache related constants
+    private final static int DEFAULT_CACHE_SIZE = 750;
+    private final static int DEFAULT_CACHE_LIFETIME = 30;
+
+    private final static int LIFETIME;
+
+    private final static String PROP_LIFETIME =
+                            "sun.security.certpath.ldap.cache.lifetime";
+
+    /*
+     * Internal system property, that when set to "true", disables the
+     * JNDI application resource files lookup to prevent recursion issues
+     * when validating signed JARs with LDAP URLs in certificates.
+     */
+    private final static String PROP_DISABLE_APP_RESOURCE_FILES =
+        "sun.security.certpath.ldap.disable.app.resource.files";
+
+    static {
+        String s = AccessController.doPrivileged(
+            (PrivilegedAction<String>) () -> System.getProperty(PROP_LIFETIME));
+        if (s != null) {
+            LIFETIME = Integer.parseInt(s); // throws NumberFormatException
+        } else {
+            LIFETIME = DEFAULT_CACHE_LIFETIME;
+        }
+    }
+
+    /**
+     * The CertificateFactory used to decode certificates from
+     * their binary stored form.
+     */
+    private CertificateFactory cf;
+    /**
+     * The JNDI directory context.
+     */
+    private LdapContext ctx;
+
+    /**
+     * Flag indicating that communication error occurred.
+     */
+    private boolean communicationError = false;
+
+    /**
+     * Flag indicating whether we should prefetch CRLs.
+     */
+    private boolean prefetchCRLs = false;
+
+    private final Cache<String, byte[][]> valueCache;
+
+    private int cacheHits = 0;
+    private int cacheMisses = 0;
+    private int requests = 0;
+
+    /**
+     * Creates a <code>CertStore</code> with the specified parameters.
+     */
+    LDAPCertStoreImpl(String serverName, int port)
+        throws InvalidAlgorithmParameterException {
+        createInitialDirContext(serverName, port);
+        // Create CertificateFactory for use later on
+        try {
+            cf = CertificateFactory.getInstance("X.509");
+        } catch (CertificateException e) {
+            throw new InvalidAlgorithmParameterException(
+                "unable to create CertificateFactory for X.509");
+        }
+        if (LIFETIME == 0) {
+            valueCache = Cache.newNullCache();
+        } else if (LIFETIME < 0) {
+            valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE);
+        } else {
+            valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE, LIFETIME);
+        }
+    }
+
+    /**
+     * Create InitialDirContext.
+     *
+     * @param server Server DNS name hosting LDAP service
+     * @param port   Port at which server listens for requests
+     * @throws InvalidAlgorithmParameterException if creation fails
+     */
+    private void createInitialDirContext(String server, int port)
+            throws InvalidAlgorithmParameterException {
+        String url = "ldap://" + server + ":" + port;
+        Hashtable<String,Object> env = new Hashtable<>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+                "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, url);
+
+        // If property is set to true, disable application resource file lookup.
+        boolean disableAppResourceFiles = AccessController.doPrivileged(
+            (PrivilegedAction<Boolean>) () -> Boolean.getBoolean(PROP_DISABLE_APP_RESOURCE_FILES));
+        if (disableAppResourceFiles) {
+            if (debug != null) {
+                debug.println("LDAPCertStore disabling app resource files");
+            }
+            env.put("com.sun.naming.disable.app.resource.files", "true");
+        }
+
+        try {
+            ctx = new InitialLdapContext(env, null);
+            /*
+             * By default, follow referrals unless application has
+             * overridden property in an application resource file.
+             */
+            Hashtable<?,?> currentEnv = ctx.getEnvironment();
+            if (currentEnv.get(Context.REFERRAL) == null) {
+                ctx.addToEnvironment(Context.REFERRAL, "follow");
+            }
+        } catch (NamingException e) {
+            if (debug != null) {
+                debug.println("LDAPCertStore.engineInit about to throw "
+                    + "InvalidAlgorithmParameterException");
+                e.printStackTrace();
+            }
+            Exception ee = new InvalidAlgorithmParameterException
+                ("unable to create InitialDirContext using supplied parameters");
+            ee.initCause(e);
+            throw (InvalidAlgorithmParameterException)ee;
+        }
+    }
+
+    /**
+     * Private class encapsulating the actual LDAP operations and cache
+     * handling. Use:
+     *
+     *   LDAPRequest request = new LDAPRequest(dn);
+     *   request.addRequestedAttribute(CROSS_CERT);
+     *   request.addRequestedAttribute(CA_CERT);
+     *   byte[][] crossValues = request.getValues(CROSS_CERT);
+     *   byte[][] caValues = request.getValues(CA_CERT);
+     *
+     * At most one LDAP request is sent for each instance created. If all
+     * getValues() calls can be satisfied from the cache, no request
+     * is sent at all. If a request is sent, all requested attributes
+     * are always added to the cache irrespective of whether the getValues()
+     * method is called.
+     */
+    private class LDAPRequest {
+
+        private final String name;
+        private Map<String, byte[][]> valueMap;
+        private final List<String> requestedAttributes;
+
+        LDAPRequest(String name) {
+            this.name = name;
+            requestedAttributes = new ArrayList<>(5);
+        }
+
+        String getName() {
+            return name;
+        }
+
+        void addRequestedAttribute(String attrId) {
+            if (valueMap != null) {
+                throw new IllegalStateException("Request already sent");
+            }
+            requestedAttributes.add(attrId);
+        }
+
+        /**
+         * Gets one or more binary values from an attribute.
+         *
+         * @param name          the location holding the attribute
+         * @param attrId                the attribute identifier
+         * @return                      an array of binary values (byte arrays)
+         * @throws NamingException      if a naming exception occurs
+         */
+        byte[][] getValues(String attrId) throws NamingException {
+            if (DEBUG && ((cacheHits + cacheMisses) % 50 == 0)) {
+                System.out.println("Cache hits: " + cacheHits + "; misses: "
+                        + cacheMisses);
+            }
+            String cacheKey = name + "|" + attrId;
+            byte[][] values = valueCache.get(cacheKey);
+            if (values != null) {
+                cacheHits++;
+                return values;
+            }
+            cacheMisses++;
+            Map<String, byte[][]> attrs = getValueMap();
+            values = attrs.get(attrId);
+            return values;
+        }
+
+        /**
+         * Get a map containing the values for this request. The first time
+         * this method is called on an object, the LDAP request is sent,
+         * the results parsed and added to a private map and also to the
+         * cache of this LDAPCertStore. Subsequent calls return the private
+         * map immediately.
+         *
+         * The map contains an entry for each requested attribute. The
+         * attribute name is the key, values are byte[][]. If there are no
+         * values for that attribute, values are byte[0][].
+         *
+         * @return                      the value Map
+         * @throws NamingException      if a naming exception occurs
+         */
+        private Map<String, byte[][]> getValueMap() throws NamingException {
+            if (valueMap != null) {
+                return valueMap;
+            }
+            if (DEBUG) {
+                System.out.println("Request: " + name + ":" + requestedAttributes);
+                requests++;
+                if (requests % 5 == 0) {
+                    System.out.println("LDAP requests: " + requests);
+                }
+            }
+            valueMap = new HashMap<>(8);
+            String[] attrIds = requestedAttributes.toArray(STRING0);
+            Attributes attrs;
+
+            if (communicationError) {
+                ctx.reconnect(null);
+                communicationError = false;
+            }
+
+            try {
+                attrs = ctx.getAttributes(name, attrIds);
+            } catch (CommunicationException ce) {
+                communicationError = true;
+                throw ce;
+            } catch (NameNotFoundException e) {
+                // name does not exist on this LDAP server
+                // treat same as not attributes found
+                attrs = EMPTY_ATTRIBUTES;
+            }
+            for (String attrId : requestedAttributes) {
+                Attribute attr = attrs.get(attrId);
+                byte[][] values = getAttributeValues(attr);
+                cacheAttribute(attrId, values);
+                valueMap.put(attrId, values);
+            }
+            return valueMap;
+        }
+
+        /**
+         * Add the values to the cache.
+         */
+        private void cacheAttribute(String attrId, byte[][] values) {
+            String cacheKey = name + "|" + attrId;
+            valueCache.put(cacheKey, values);
+        }
+
+        /**
+         * Get the values for the given attribute. If the attribute is null
+         * or does not contain any values, a zero length byte array is
+         * returned. NOTE that it is assumed that all values are byte arrays.
+         */
+        private byte[][] getAttributeValues(Attribute attr)
+                throws NamingException {
+            byte[][] values;
+            if (attr == null) {
+                values = BB0;
+            } else {
+                values = new byte[attr.size()][];
+                int i = 0;
+                NamingEnumeration<?> enum_ = attr.getAll();
+                while (enum_.hasMore()) {
+                    Object obj = enum_.next();
+                    if (debug != null) {
+                        if (obj instanceof String) {
+                            debug.println("LDAPCertStore.getAttrValues() "
+                                + "enum.next is a string!: " + obj);
+                        }
+                    }
+                    byte[] value = (byte[])obj;
+                    values[i++] = value;
+                }
+            }
+            return values;
+        }
+
+    }
+
+    /*
+     * Gets certificates from an attribute id and location in the LDAP
+     * directory. Returns a Collection containing only the Certificates that
+     * match the specified CertSelector.
+     *
+     * @param name the location holding the attribute
+     * @param id the attribute identifier
+     * @param sel a CertSelector that the Certificates must match
+     * @return a Collection of Certificates found
+     * @throws CertStoreException       if an exception occurs
+     */
+    private Collection<X509Certificate> getCertificates(LDAPRequest request,
+        String id, X509CertSelector sel) throws CertStoreException {
+
+        /* fetch encoded certs from storage */
+        byte[][] encodedCert;
+        try {
+            encodedCert = request.getValues(id);
+        } catch (NamingException namingEx) {
+            throw new CertStoreException(namingEx);
+        }
+
+        int n = encodedCert.length;
+        if (n == 0) {
+            return Collections.emptySet();
+        }
+
+        List<X509Certificate> certs = new ArrayList<>(n);
+        /* decode certs and check if they satisfy selector */
+        for (int i = 0; i < n; i++) {
+            ByteArrayInputStream bais = new ByteArrayInputStream(encodedCert[i]);
+            try {
+                Certificate cert = cf.generateCertificate(bais);
+                if (sel.match(cert)) {
+                  certs.add((X509Certificate)cert);
+                }
+            } catch (CertificateException e) {
+                if (debug != null) {
+                    debug.println("LDAPCertStore.getCertificates() encountered "
+                        + "exception while parsing cert, skipping the bad data: ");
+                    HexDumpEncoder encoder = new HexDumpEncoder();
+                    debug.println(
+                        "[ " + encoder.encodeBuffer(encodedCert[i]) + " ]");
+                }
+            }
+        }
+
+        return certs;
+    }
+
+    /*
+     * Gets certificate pairs from an attribute id and location in the LDAP
+     * directory.
+     *
+     * @param name the location holding the attribute
+     * @param id the attribute identifier
+     * @return a Collection of X509CertificatePairs found
+     * @throws CertStoreException       if an exception occurs
+     */
+    private Collection<X509CertificatePair> getCertPairs(
+        LDAPRequest request, String id) throws CertStoreException {
+
+        /* fetch the encoded cert pairs from storage */
+        byte[][] encodedCertPair;
+        try {
+            encodedCertPair = request.getValues(id);
+        } catch (NamingException namingEx) {
+            throw new CertStoreException(namingEx);
+        }
+
+        int n = encodedCertPair.length;
+        if (n == 0) {
+            return Collections.emptySet();
+        }
+
+        List<X509CertificatePair> certPairs = new ArrayList<>(n);
+        /* decode each cert pair and add it to the Collection */
+        for (int i = 0; i < n; i++) {
+            try {
+                X509CertificatePair certPair =
+                    X509CertificatePair.generateCertificatePair(encodedCertPair[i]);
+                certPairs.add(certPair);
+            } catch (CertificateException e) {
+                if (debug != null) {
+                    debug.println(
+                        "LDAPCertStore.getCertPairs() encountered exception "
+                        + "while parsing cert, skipping the bad data: ");
+                    HexDumpEncoder encoder = new HexDumpEncoder();
+                    debug.println(
+                        "[ " + encoder.encodeBuffer(encodedCertPair[i]) + " ]");
+                }
+            }
+        }
+
+        return certPairs;
+    }
+
+    /*
+     * Looks at certificate pairs stored in the crossCertificatePair attribute
+     * at the specified location in the LDAP directory. Returns a Collection
+     * containing all X509Certificates stored in the forward component that match
+     * the forward X509CertSelector and all Certificates stored in the reverse
+     * component that match the reverse X509CertSelector.
+     * <p>
+     * If either forward or reverse is null, all certificates from the
+     * corresponding component will be rejected.
+     *
+     * @param name the location to look in
+     * @param forward the forward X509CertSelector (or null)
+     * @param reverse the reverse X509CertSelector (or null)
+     * @return a Collection of X509Certificates found
+     * @throws CertStoreException       if an exception occurs
+     */
+    private Collection<X509Certificate> getMatchingCrossCerts(
+            LDAPRequest request, X509CertSelector forward,
+            X509CertSelector reverse)
+            throws CertStoreException {
+        // Get the cert pairs
+        Collection<X509CertificatePair> certPairs =
+                                getCertPairs(request, CROSS_CERT);
+
+        // Find Certificates that match and put them in a list
+        ArrayList<X509Certificate> matchingCerts = new ArrayList<>();
+        for (X509CertificatePair certPair : certPairs) {
+            X509Certificate cert;
+            if (forward != null) {
+                cert = certPair.getForward();
+                if ((cert != null) && forward.match(cert)) {
+                    matchingCerts.add(cert);
+                }
+            }
+            if (reverse != null) {
+                cert = certPair.getReverse();
+                if ((cert != null) && reverse.match(cert)) {
+                    matchingCerts.add(cert);
+                }
+            }
+        }
+        return matchingCerts;
+    }
+
+    /**
+     * Returns a <code>Collection</code> of <code>X509Certificate</code>s that
+     * match the specified selector. If no <code>X509Certificate</code>s
+     * match the selector, an empty <code>Collection</code> will be returned.
+     * <p>
+     * It is not practical to search every entry in the LDAP database for
+     * matching <code>X509Certificate</code>s. Instead, the
+     * <code>X509CertSelector</code> is examined in order to determine where
+     * matching <code>Certificate</code>s are likely to be found (according
+     * to the PKIX LDAPv2 schema, RFC 2587).
+     * If the subject is specified, its directory entry is searched. If the
+     * issuer is specified, its directory entry is searched. If neither the
+     * subject nor the issuer are specified (or the selector is not an
+     * <code>X509CertSelector</code>), a <code>CertStoreException</code> is
+     * thrown.
+     *
+     * @param selector a <code>X509CertSelector</code> used to select which
+     *  <code>Certificate</code>s should be returned.
+     * @return a <code>Collection</code> of <code>X509Certificate</code>s that
+     *         match the specified selector
+     * @throws CertStoreException if an exception occurs
+     */
+    synchronized Collection<X509Certificate> getCertificates
+        (X509CertSelector xsel, String ldapDN) throws CertStoreException {
+
+        if (ldapDN == null) {
+            ldapDN = xsel.getSubjectAsString();
+        }
+        int basicConstraints = xsel.getBasicConstraints();
+        String issuer = xsel.getIssuerAsString();
+        HashSet<X509Certificate> certs = new HashSet<>();
+        if (debug != null) {
+            debug.println("LDAPCertStore.engineGetCertificates() basicConstraints: "
+                + basicConstraints);
+        }
+
+        // basicConstraints:
+        // -2: only EE certs accepted
+        // -1: no check is done
+        //  0: any CA certificate accepted
+        // >1: certificate's basicConstraints extension pathlen must match
+        if (ldapDN != null) {
+            if (debug != null) {
+                debug.println("LDAPCertStore.engineGetCertificates() "
+                    + " subject is not null");
+            }
+            LDAPRequest request = new LDAPRequest(ldapDN);
+            if (basicConstraints > -2) {
+                request.addRequestedAttribute(CROSS_CERT);
+                request.addRequestedAttribute(CA_CERT);
+                request.addRequestedAttribute(ARL);
+                if (prefetchCRLs) {
+                    request.addRequestedAttribute(CRL);
+                }
+            }
+            if (basicConstraints < 0) {
+                request.addRequestedAttribute(USER_CERT);
+            }
+
+            if (basicConstraints > -2) {
+                certs.addAll(getMatchingCrossCerts(request, xsel, null));
+                if (debug != null) {
+                    debug.println("LDAPCertStore.engineGetCertificates() after "
+                        + "getMatchingCrossCerts(subject,xsel,null),certs.size(): "
+                        + certs.size());
+                }
+                certs.addAll(getCertificates(request, CA_CERT, xsel));
+                if (debug != null) {
+                    debug.println("LDAPCertStore.engineGetCertificates() after "
+                        + "getCertificates(subject,CA_CERT,xsel),certs.size(): "
+                        + certs.size());
+                }
+            }
+            if (basicConstraints < 0) {
+                certs.addAll(getCertificates(request, USER_CERT, xsel));
+                if (debug != null) {
+                    debug.println("LDAPCertStore.engineGetCertificates() after "
+                        + "getCertificates(subject,USER_CERT, xsel),certs.size(): "
+                        + certs.size());
+                }
+            }
+        } else {
+            if (debug != null) {
+                debug.println
+                    ("LDAPCertStore.engineGetCertificates() subject is null");
+            }
+            if (basicConstraints == -2) {
+                throw new CertStoreException("need subject to find EE certs");
+            }
+            if (issuer == null) {
+                throw new CertStoreException("need subject or issuer to find certs");
+            }
+        }
+        if (debug != null) {
+            debug.println("LDAPCertStore.engineGetCertificates() about to "
+                + "getMatchingCrossCerts...");
+        }
+        if ((issuer != null) && (basicConstraints > -2)) {
+            LDAPRequest request = new LDAPRequest(issuer);
+            request.addRequestedAttribute(CROSS_CERT);
+            request.addRequestedAttribute(CA_CERT);
+            request.addRequestedAttribute(ARL);
+            if (prefetchCRLs) {
+                request.addRequestedAttribute(CRL);
+            }
+
+            certs.addAll(getMatchingCrossCerts(request, null, xsel));
+            if (debug != null) {
+                debug.println("LDAPCertStore.engineGetCertificates() after "
+                    + "getMatchingCrossCerts(issuer,null,xsel),certs.size(): "
+                    + certs.size());
+            }
+            certs.addAll(getCertificates(request, CA_CERT, xsel));
+            if (debug != null) {
+                debug.println("LDAPCertStore.engineGetCertificates() after "
+                    + "getCertificates(issuer,CA_CERT,xsel),certs.size(): "
+                    + certs.size());
+            }
+        }
+        if (debug != null) {
+            debug.println("LDAPCertStore.engineGetCertificates() returning certs");
+        }
+        return certs;
+    }
+
+    /*
+     * Gets CRLs from an attribute id and location in the LDAP directory.
+     * Returns a Collection containing only the CRLs that match the
+     * specified X509CRLSelector.
+     *
+     * @param name the location holding the attribute
+     * @param id the attribute identifier
+     * @param sel a X509CRLSelector that the CRLs must match
+     * @return a Collection of CRLs found
+     * @throws CertStoreException       if an exception occurs
+     */
+    private Collection<X509CRL> getCRLs(LDAPRequest request, String id,
+            X509CRLSelector sel) throws CertStoreException {
+
+        /* fetch the encoded crls from storage */
+        byte[][] encodedCRL;
+        try {
+            encodedCRL = request.getValues(id);
+        } catch (NamingException namingEx) {
+            throw new CertStoreException(namingEx);
+        }
+
+        int n = encodedCRL.length;
+        if (n == 0) {
+            return Collections.emptySet();
+        }
+
+        List<X509CRL> crls = new ArrayList<>(n);
+        /* decode each crl and check if it matches selector */
+        for (int i = 0; i < n; i++) {
+            try {
+                CRL crl = cf.generateCRL(new ByteArrayInputStream(encodedCRL[i]));
+                if (sel.match(crl)) {
+                    crls.add((X509CRL)crl);
+                }
+            } catch (CRLException e) {
+                if (debug != null) {
+                    debug.println("LDAPCertStore.getCRLs() encountered exception"
+                        + " while parsing CRL, skipping the bad data: ");
+                    HexDumpEncoder encoder = new HexDumpEncoder();
+                    debug.println("[ " + encoder.encodeBuffer(encodedCRL[i]) + " ]");
+                }
+            }
+        }
+
+        return crls;
+    }
+
+    /**
+     * Returns a <code>Collection</code> of <code>X509CRL</code>s that
+     * match the specified selector. If no <code>X509CRL</code>s
+     * match the selector, an empty <code>Collection</code> will be returned.
+     * <p>
+     * It is not practical to search every entry in the LDAP database for
+     * matching <code>X509CRL</code>s. Instead, the <code>X509CRLSelector</code>
+     * is examined in order to determine where matching <code>X509CRL</code>s
+     * are likely to be found (according to the PKIX LDAPv2 schema, RFC 2587).
+     * If issuerNames or certChecking are specified, the issuer's directory
+     * entry is searched. If neither issuerNames or certChecking are specified
+     * (or the selector is not an <code>X509CRLSelector</code>), a
+     * <code>CertStoreException</code> is thrown.
+     *
+     * @param selector A <code>X509CRLSelector</code> used to select which
+     *  <code>CRL</code>s should be returned. Specify <code>null</code>
+     *  to return all <code>CRL</code>s.
+     * @return A <code>Collection</code> of <code>X509CRL</code>s that
+     *         match the specified selector
+     * @throws CertStoreException if an exception occurs
+     */
+    synchronized Collection<X509CRL> getCRLs(X509CRLSelector xsel,
+         String ldapDN) throws CertStoreException {
+
+        HashSet<X509CRL> crls = new HashSet<>();
+
+        // Look in directory entry for issuer of cert we're checking.
+        Collection<Object> issuerNames;
+        X509Certificate certChecking = xsel.getCertificateChecking();
+        if (certChecking != null) {
+            issuerNames = new HashSet<>();
+            X500Principal issuer = certChecking.getIssuerX500Principal();
+            issuerNames.add(issuer.getName(X500Principal.RFC2253));
+        } else {
+            // But if we don't know which cert we're checking, try the directory
+            // entries of all acceptable CRL issuers
+            if (ldapDN != null) {
+                issuerNames = new HashSet<>();
+                issuerNames.add(ldapDN);
+            } else {
+                issuerNames = xsel.getIssuerNames();
+                if (issuerNames == null) {
+                    throw new CertStoreException("need issuerNames or"
+                       + " certChecking to find CRLs");
+                }
+            }
+        }
+        for (Object nameObject : issuerNames) {
+            String issuerName;
+            if (nameObject instanceof byte[]) {
+                try {
+                    X500Principal issuer = new X500Principal((byte[])nameObject);
+                    issuerName = issuer.getName(X500Principal.RFC2253);
+                } catch (IllegalArgumentException e) {
+                    continue;
+                }
+            } else {
+                issuerName = (String)nameObject;
+            }
+            // If all we want is CA certs, try to get the (probably shorter) ARL
+            Collection<X509CRL> entryCRLs = Collections.emptySet();
+            if (certChecking == null || certChecking.getBasicConstraints() != -1) {
+                LDAPRequest request = new LDAPRequest(issuerName);
+                request.addRequestedAttribute(CROSS_CERT);
+                request.addRequestedAttribute(CA_CERT);
+                request.addRequestedAttribute(ARL);
+                if (prefetchCRLs) {
+                    request.addRequestedAttribute(CRL);
+                }
+                try {
+                    entryCRLs = getCRLs(request, ARL, xsel);
+                    if (entryCRLs.isEmpty()) {
+                        // no ARLs found. We assume that means that there are
+                        // no ARLs on this server at all and prefetch the CRLs.
+                        prefetchCRLs = true;
+                    } else {
+                        crls.addAll(entryCRLs);
+                    }
+                } catch (CertStoreException e) {
+                    if (debug != null) {
+                        debug.println("LDAPCertStore.engineGetCRLs non-fatal error "
+                            + "retrieving ARLs:" + e);
+                        e.printStackTrace();
+                    }
+                }
+            }
+            // Otherwise, get the CRL
+            // if certChecking is null, we don't know if we should look in ARL or CRL
+            // attribute, so check both for matching CRLs.
+            if (entryCRLs.isEmpty() || certChecking == null) {
+                LDAPRequest request = new LDAPRequest(issuerName);
+                request.addRequestedAttribute(CRL);
+                entryCRLs = getCRLs(request, CRL, xsel);
+                crls.addAll(entryCRLs);
+            }
+        }
+        return crls;
+    }
+}
--- a/jdk/src/java.prefs/windows/classes/java/util/prefs/WindowsPreferences.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.prefs/windows/classes/java/util/prefs/WindowsPreferences.java	Tue May 19 11:40:00 2015 -0700
@@ -62,8 +62,8 @@
     /**
      * Windows registry path to <tt>Preferences</tt>'s root nodes.
      */
-    private static final byte[] WINDOWS_ROOT_PATH
-                               = stringToByteArray("Software\\JavaSoft\\Prefs");
+    private static final byte[] WINDOWS_ROOT_PATH =
+        stringToByteArray("Software\\JavaSoft\\Prefs");
 
     /**
      * Windows handles to <tt>HKEY_CURRENT_USER</tt> and
@@ -147,12 +147,12 @@
      * Java wrapper for Windows registry API RegOpenKey()
      */
     private static native int[] WindowsRegOpenKey(int hKey, byte[] subKey,
-                                                         int securityMask);
+                                                  int securityMask);
     /**
      * Retries RegOpenKey() MAX_ATTEMPTS times before giving up.
      */
     private static int[] WindowsRegOpenKey1(int hKey, byte[] subKey,
-                                                      int securityMask) {
+                                            int securityMask) {
         int[] result = WindowsRegOpenKey(hKey, subKey, securityMask);
         if (result[ERROR_CODE] == ERROR_SUCCESS) {
             return result;
@@ -167,16 +167,16 @@
         } else if (result[ERROR_CODE] != ERROR_ACCESS_DENIED) {
             long sleepTime = INIT_SLEEP_TIME;
             for (int i = 0; i < MAX_ATTEMPTS; i++) {
-            try {
-                Thread.sleep(sleepTime);
-            } catch(InterruptedException e) {
-                return result;
-            }
-            sleepTime *= 2;
-            result = WindowsRegOpenKey(hKey, subKey, securityMask);
-            if (result[ERROR_CODE] == ERROR_SUCCESS) {
-                return result;
-            }
+                try {
+                    Thread.sleep(sleepTime);
+                } catch(InterruptedException e) {
+                    return result;
+                }
+                sleepTime *= 2;
+                result = WindowsRegOpenKey(hKey, subKey, securityMask);
+                if (result[ERROR_CODE] == ERROR_SUCCESS) {
+                    return result;
+                }
             }
         }
         return result;
@@ -198,10 +198,10 @@
     private static int[] WindowsRegCreateKeyEx1(int hKey, byte[] subKey) {
         int[] result = WindowsRegCreateKeyEx(hKey, subKey);
         if (result[ERROR_CODE] == ERROR_SUCCESS) {
-                return result;
-            } else {
-                long sleepTime = INIT_SLEEP_TIME;
-                for (int i = 0; i < MAX_ATTEMPTS; i++) {
+            return result;
+        } else {
+            long sleepTime = INIT_SLEEP_TIME;
+            for (int i = 0; i < MAX_ATTEMPTS; i++) {
                 try {
                     Thread.sleep(sleepTime);
                 } catch(InterruptedException e) {
@@ -210,7 +210,7 @@
                 sleepTime *= 2;
                 result = WindowsRegCreateKeyEx(hKey, subKey);
                 if (result[ERROR_CODE] == ERROR_SUCCESS) {
-                return result;
+                    return result;
                 }
             }
         }
@@ -232,10 +232,10 @@
     private static int WindowsRegFlushKey1(int hKey) {
         int result = WindowsRegFlushKey(hKey);
         if (result == ERROR_SUCCESS) {
-                return result;
-            } else {
-                long sleepTime = INIT_SLEEP_TIME;
-                for (int i = 0; i < MAX_ATTEMPTS; i++) {
+            return result;
+        } else {
+            long sleepTime = INIT_SLEEP_TIME;
+            for (int i = 0; i < MAX_ATTEMPTS; i++) {
                 try {
                     Thread.sleep(sleepTime);
                 } catch(InterruptedException e) {
@@ -244,7 +244,7 @@
                 sleepTime *= 2;
                 result = WindowsRegFlushKey(hKey);
                 if (result == ERROR_SUCCESS) {
-                return result;
+                    return result;
                 }
             }
         }
@@ -255,23 +255,23 @@
      * Java wrapper for Windows registry API RegQueryValueEx()
      */
     private static native byte[] WindowsRegQueryValueEx(int hKey,
-                                                              byte[] valueName);
+                                                        byte[] valueName);
     /**
      * Java wrapper for Windows registry API RegSetValueEx()
      */
     private static native int WindowsRegSetValueEx(int hKey, byte[] valueName,
-                                                         byte[] value);
+                                                   byte[] value);
     /**
      * Retries RegSetValueEx() MAX_ATTEMPTS times before giving up.
      */
     private static int WindowsRegSetValueEx1(int hKey, byte[] valueName,
-                                                         byte[] value) {
+                                             byte[] value) {
         int result = WindowsRegSetValueEx(hKey, valueName, value);
         if (result == ERROR_SUCCESS) {
-                return result;
-            } else {
-                long sleepTime = INIT_SLEEP_TIME;
-                for (int i = 0; i < MAX_ATTEMPTS; i++) {
+            return result;
+        } else {
+            long sleepTime = INIT_SLEEP_TIME;
+            for (int i = 0; i < MAX_ATTEMPTS; i++) {
                 try {
                     Thread.sleep(sleepTime);
                 } catch(InterruptedException e) {
@@ -280,7 +280,7 @@
                 sleepTime *= 2;
                 result = WindowsRegSetValueEx(hKey, valueName, value);
                 if (result == ERROR_SUCCESS) {
-                return result;
+                    return result;
                 }
             }
         }
@@ -303,10 +303,10 @@
     private static int[] WindowsRegQueryInfoKey1(int hKey) {
         int[] result = WindowsRegQueryInfoKey(hKey);
         if (result[ERROR_CODE] == ERROR_SUCCESS) {
-                return result;
-            } else {
-                long sleepTime = INIT_SLEEP_TIME;
-                for (int i = 0; i < MAX_ATTEMPTS; i++) {
+            return result;
+        } else {
+            long sleepTime = INIT_SLEEP_TIME;
+            for (int i = 0; i < MAX_ATTEMPTS; i++) {
                 try {
                     Thread.sleep(sleepTime);
                 } catch(InterruptedException e) {
@@ -315,7 +315,7 @@
                 sleepTime *= 2;
                 result = WindowsRegQueryInfoKey(hKey);
                 if (result[ERROR_CODE] == ERROR_SUCCESS) {
-                return result;
+                    return result;
                 }
             }
         }
@@ -326,19 +326,19 @@
      * Java wrapper for Windows registry API RegEnumKeyEx()
      */
     private static native byte[] WindowsRegEnumKeyEx(int hKey, int subKeyIndex,
-                                      int maxKeyLength);
+                                                     int maxKeyLength);
 
     /**
      * Retries RegEnumKeyEx() MAX_ATTEMPTS times before giving up.
      */
     private static byte[] WindowsRegEnumKeyEx1(int hKey, int subKeyIndex,
-                                      int maxKeyLength) {
+                                               int maxKeyLength) {
         byte[] result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
         if (result != null) {
-                return result;
-            } else {
-                long sleepTime = INIT_SLEEP_TIME;
-                for (int i = 0; i < MAX_ATTEMPTS; i++) {
+            return result;
+        } else {
+            long sleepTime = INIT_SLEEP_TIME;
+            for (int i = 0; i < MAX_ATTEMPTS; i++) {
                 try {
                     Thread.sleep(sleepTime);
                 } catch(InterruptedException e) {
@@ -347,7 +347,7 @@
                 sleepTime *= 2;
                 result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
                 if (result != null) {
-                return result;
+                    return result;
                 }
             }
         }
@@ -358,19 +358,19 @@
      * Java wrapper for Windows registry API RegEnumValue()
      */
     private static native byte[] WindowsRegEnumValue(int hKey, int valueIndex,
-                                      int maxValueNameLength);
+                                                     int maxValueNameLength);
     /**
      * Retries RegEnumValueEx() MAX_ATTEMPTS times before giving up.
      */
     private static byte[] WindowsRegEnumValue1(int hKey, int valueIndex,
-                                      int maxValueNameLength) {
+                                               int maxValueNameLength) {
         byte[] result = WindowsRegEnumValue(hKey, valueIndex,
-                                                            maxValueNameLength);
+                                            maxValueNameLength);
         if (result != null) {
-                return result;
-            } else {
-                long sleepTime = INIT_SLEEP_TIME;
-                for (int i = 0; i < MAX_ATTEMPTS; i++) {
+            return result;
+        } else {
+            long sleepTime = INIT_SLEEP_TIME;
+            for (int i = 0; i < MAX_ATTEMPTS; i++) {
                 try {
                     Thread.sleep(sleepTime);
                 } catch(InterruptedException e) {
@@ -378,9 +378,9 @@
                 }
                 sleepTime *= 2;
                 result = WindowsRegEnumValue(hKey, valueIndex,
-                                                            maxValueNameLength);
+                                             maxValueNameLength);
                 if (result != null) {
-                return result;
+                    return result;
                 }
             }
         }
@@ -404,11 +404,11 @@
         int[] result =
                WindowsRegCreateKeyEx1(parentNativeHandle, toWindowsName(name));
         if (result[ERROR_CODE] != ERROR_SUCCESS) {
-            logger().warning("Could not create windows registry "
-            + "node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegCreateKeyEx(...) returned error code " +
-            result[ERROR_CODE] + ".");
+            logger().warning("Could not create windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegCreateKeyEx(...) returned error code " +
+                    result[ERROR_CODE] + ".");
             isBackingStoreAvailable = false;
             return;
         }
@@ -426,15 +426,15 @@
      * @param rootDirectory Path to root directory, as a byte-encoded string.
      */
     private  WindowsPreferences(int rootNativeHandle, byte[] rootDirectory) {
-        super(null,"");
+        super(null, "");
         int[] result =
                 WindowsRegCreateKeyEx1(rootNativeHandle, rootDirectory);
         if (result[ERROR_CODE] != ERROR_SUCCESS) {
             logger().warning("Could not open/create prefs root node " +
-            byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
-            Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegCreateKeyEx(...) returned error code " +
-            result[ERROR_CODE] + ".");
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegCreateKeyEx(...) returned error code " +
+                    result[ERROR_CODE] + ".");
             isBackingStoreAvailable = false;
             return;
         }
@@ -451,7 +451,7 @@
     private byte[] windowsAbsolutePath() {
         ByteArrayOutputStream bstream = new ByteArrayOutputStream();
         bstream.write(WINDOWS_ROOT_PATH, 0, WINDOWS_ROOT_PATH.length-1);
-        StringTokenizer tokenizer = new StringTokenizer(absolutePath(),"/");
+        StringTokenizer tokenizer = new StringTokenizer(absolutePath(), "/");
         while (tokenizer.hasMoreTokens()) {
             bstream.write((byte)'\\');
             String nextName = tokenizer.nextToken();
@@ -505,27 +505,30 @@
         /*  Check if key's path is short enough be opened at once
             otherwise use a path-splitting procedure */
         if (windowsAbsolutePath.length <= MAX_WINDOWS_PATH_LENGTH + 1) {
-             int[] result = WindowsRegOpenKey1(rootNativeHandle(),
-                                               windowsAbsolutePath, mask1);
-             if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
-                 result = WindowsRegOpenKey1(rootNativeHandle(),
-                                             windowsAbsolutePath, mask2);
+            int[] result = WindowsRegOpenKey1(rootNativeHandle(),
+                                              windowsAbsolutePath, mask1);
+            if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+                result = WindowsRegOpenKey1(rootNativeHandle(),
+                                            windowsAbsolutePath, mask2);
 
-             if (result[ERROR_CODE] != ERROR_SUCCESS) {
-                logger().warning("Could not open windows "
-                + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-                " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-                ". Windows RegOpenKey(...) returned error code " +
-                result[ERROR_CODE] + ".");
+            if (result[ERROR_CODE] != ERROR_SUCCESS) {
+                logger().warning("Could not open windows registry node " +
+                        byteArrayToString(windowsAbsolutePath()) +
+                        " at root 0x" +
+                        Integer.toHexString(rootNativeHandle()) +
+                        ". Windows RegOpenKey(...) returned error code " +
+                        result[ERROR_CODE] + ".");
                 result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
                 if (result[ERROR_CODE] == ERROR_ACCESS_DENIED) {
-                    throw new SecurityException("Could not open windows "
-                + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-                " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-                ": Access denied");
+                    throw new SecurityException(
+                            "Could not open windows registry node " +
+                            byteArrayToString(windowsAbsolutePath()) +
+                            " at root 0x" +
+                            Integer.toHexString(rootNativeHandle()) +
+                            ": Access denied");
                 }
-             }
-             return result[NATIVE_HANDLE];
+            }
+            return result[NATIVE_HANDLE];
         } else {
             return openKey(rootNativeHandle(), windowsAbsolutePath, mask1, mask2);
         }
@@ -548,21 +551,21 @@
                         int mask1, int mask2) {
     /* If the path is short enough open at once. Otherwise split the path */
         if (windowsRelativePath.length <= MAX_WINDOWS_PATH_LENGTH + 1 ) {
-             int[] result = WindowsRegOpenKey1(nativeHandle,
-                                               windowsRelativePath, mask1);
-             if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
-                 result = WindowsRegOpenKey1(nativeHandle,
-                                             windowsRelativePath, mask2);
+            int[] result = WindowsRegOpenKey1(nativeHandle,
+                                              windowsRelativePath, mask1);
+            if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+                result = WindowsRegOpenKey1(nativeHandle,
+                                            windowsRelativePath, mask2);
 
-             if (result[ERROR_CODE] != ERROR_SUCCESS) {
-                logger().warning("Could not open windows "
-                + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-                " at root 0x" + Integer.toHexString(nativeHandle) +
-                ". Windows RegOpenKey(...) returned error code " +
-                result[ERROR_CODE] + ".");
+            if (result[ERROR_CODE] != ERROR_SUCCESS) {
+                logger().warning("Could not open windows registry node " +
+                        byteArrayToString(windowsAbsolutePath()) +
+                        " at root 0x" + Integer.toHexString(nativeHandle) +
+                        ". Windows RegOpenKey(...) returned error code " +
+                        result[ERROR_CODE] + ".");
                 result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
-             }
-             return result[NATIVE_HANDLE];
+            }
+            return result[NATIVE_HANDLE];
         } else {
             int separatorPosition = -1;
             // Be greedy - open the longest possible path
@@ -604,10 +607,12 @@
     private void closeKey(int nativeHandle) {
         int result = WindowsRegCloseKey(nativeHandle);
         if (result != ERROR_SUCCESS) {
-            logger().warning("Could not close windows "
-            + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegCloseKey(...) returned error code " + result + ".");
+            logger().warning("Could not close windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegCloseKey(...) returned error code " +
+                    result + ".");
         }
     }
 
@@ -627,10 +632,13 @@
                 toWindowsName(javaName), toWindowsValueString(value));
         if (result != ERROR_SUCCESS) {
             logger().warning("Could not assign value to key " +
-            byteArrayToString(toWindowsName(javaName))+ " at Windows registry node "
-           + byteArrayToString(windowsAbsolutePath()) + " at root 0x"
-           + Integer.toHexString(rootNativeHandle()) +
-           ". Windows RegSetValueEx(...) returned error code " + result + ".");
+                    byteArrayToString(toWindowsName(javaName)) +
+                    " at Windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegSetValueEx(...) returned error code " +
+                    result + ".");
             isBackingStoreAvailable = false;
         }
         closeKey(nativeHandle);
@@ -672,12 +680,12 @@
         int result =
             WindowsRegDeleteValue(nativeHandle, toWindowsName(key));
         if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) {
-            logger().warning("Could not delete windows registry "
-            + "value " + byteArrayToString(windowsAbsolutePath())+ "\\" +
-            toWindowsName(key) + " at root 0x" +
-            Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegDeleteValue(...) returned error code " +
-            result + ".");
+            logger().warning("Could not delete windows registry value " +
+                    byteArrayToString(windowsAbsolutePath()) + "\\" +
+                    toWindowsName(key) + " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegDeleteValue(...) returned error code " +
+                    result + ".");
             isBackingStoreAvailable = false;
         }
         closeKey(nativeHandle);
@@ -693,17 +701,20 @@
         // Find out the number of values
         int nativeHandle = openKey(KEY_QUERY_VALUE);
         if (nativeHandle == NULL_NATIVE_HANDLE) {
-            throw new BackingStoreException("Could not open windows"
-            + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+            throw new BackingStoreException(
+                    "Could not open windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) + ".");
         }
         int[] result =  WindowsRegQueryInfoKey1(nativeHandle);
         if (result[ERROR_CODE] != ERROR_SUCCESS) {
-            String info = "Could not query windows"
-            + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegQueryInfoKeyEx(...) returned error code " +
-            result[ERROR_CODE] + ".";
+            String info = "Could not query windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegQueryInfoKeyEx(...) returned error code " +
+                    result[ERROR_CODE] + ".";
             logger().warning(info);
             throw new BackingStoreException(info);
         }
@@ -712,17 +723,17 @@
         if (valuesNumber == 0) {
             closeKey(nativeHandle);
             return new String[0];
-       }
-       // Get the values
-       String[] valueNames = new String[valuesNumber];
-       for (int i = 0; i < valuesNumber; i++) {
+        }
+        // Get the values
+        String[] valueNames = new String[valuesNumber];
+        for (int i = 0; i < valuesNumber; i++) {
             byte[] windowsName = WindowsRegEnumValue1(nativeHandle, i,
-                                                        maxValueNameLength+1);
+                                                      maxValueNameLength+1);
             if (windowsName == null) {
                 String info =
-                "Could not enumerate value #" + i + "  of windows node " +
-                byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
-                Integer.toHexString(rootNativeHandle()) + ".";
+                    "Could not enumerate value #" + i + "  of windows node " +
+                    byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) + ".";
                 logger().warning(info);
                 throw new BackingStoreException(info);
             }
@@ -740,20 +751,22 @@
      */
     protected String[] childrenNamesSpi() throws BackingStoreException {
         // Open key
-        int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS| KEY_QUERY_VALUE);
+        int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE);
         if (nativeHandle == NULL_NATIVE_HANDLE) {
-            throw new BackingStoreException("Could not open windows"
-            + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+            throw new BackingStoreException(
+                    "Could not open windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) + ".");
         }
         // Get number of children
         int[] result =  WindowsRegQueryInfoKey1(nativeHandle);
         if (result[ERROR_CODE] != ERROR_SUCCESS) {
-            String info = "Could not query windows"
-            + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegQueryInfoKeyEx(...) returned error code " +
-            result[ERROR_CODE] + ".";
+            String info = "Could not query windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegQueryInfoKeyEx(...) returned error code " +
+                    result[ERROR_CODE] + ".";
             logger().warning(info);
             throw new BackingStoreException(info);
         }
@@ -768,12 +781,12 @@
         // Get children
         for (int i = 0; i < subKeysNumber; i++) {
             byte[] windowsName = WindowsRegEnumKeyEx1(nativeHandle, i,
-                                                                maxKeyLength+1);
+                                                      maxKeyLength+1);
             if (windowsName == null) {
                 String info =
-                "Could not enumerate key #" + i + "  of windows node " +
-                byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
-                Integer.toHexString(rootNativeHandle()) + ". ";
+                    "Could not enumerate key #" + i + "  of windows node " +
+                    byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) + ". ";
                 logger().warning(info);
                 throw new BackingStoreException(info);
             }
@@ -798,20 +811,24 @@
         }
         if (!isBackingStoreAvailable) {
             throw new BackingStoreException(
-                                       "flush(): Backing store not available.");
+                    "flush(): Backing store not available.");
         }
         int nativeHandle = openKey(KEY_READ);
         if (nativeHandle == NULL_NATIVE_HANDLE) {
-            throw new BackingStoreException("Could not open windows"
-            + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+            throw new BackingStoreException(
+                    "Could not open windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) + ".");
         }
         int result = WindowsRegFlushKey1(nativeHandle);
         if (result != ERROR_SUCCESS) {
-            String info = "Could not flush windows "
-            + "registry node " + byteArrayToString(windowsAbsolutePath())
-            + " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegFlushKey(...) returned error code " + result + ".";
+            String info = "Could not flush windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegFlushKey(...) returned error code " +
+                    result + ".";
             logger().warning(info);
             throw new BackingStoreException(info);
         }
@@ -838,7 +855,7 @@
      * Logs a warning message, if Windows Registry is unavailable.
      */
     protected AbstractPreferences childSpi(String name) {
-            return new WindowsPreferences(this, name);
+        return new WindowsPreferences(this, name);
     }
 
     /**
@@ -849,20 +866,22 @@
      */
     public void removeNodeSpi() throws BackingStoreException {
         int parentNativeHandle =
-                         ((WindowsPreferences)parent()).openKey(DELETE);
+                ((WindowsPreferences)parent()).openKey(DELETE);
         if (parentNativeHandle == NULL_NATIVE_HANDLE) {
-            throw new BackingStoreException("Could not open parent windows"
-            + "registry node of " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+            throw new BackingStoreException(
+                    "Could not open parent windows registry node of " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" +
+                    Integer.toHexString(rootNativeHandle()) + ".");
         }
         int result =
                 WindowsRegDeleteKey(parentNativeHandle, toWindowsName(name()));
         if (result != ERROR_SUCCESS) {
-            String info = "Could not delete windows "
-            + "registry node " + byteArrayToString(windowsAbsolutePath()) +
-            " at root 0x" + Integer.toHexString(rootNativeHandle()) +
-            ". Windows RegDeleteKeyEx(...) returned error code " +
-            result + ".";
+            String info = "Could not delete windows registry node " +
+                    byteArrayToString(windowsAbsolutePath()) +
+                    " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+                    ". Windows RegDeleteKeyEx(...) returned error code " +
+                    result + ".";
             logger().warning(info);
             throw new BackingStoreException(info);
         }
@@ -879,23 +898,25 @@
     private static String toJavaName(byte[] windowsNameArray) {
         String windowsName = byteArrayToString(windowsNameArray);
         // check if Alt64
-        if ((windowsName.length()>1) &&
-                                   (windowsName.substring(0,2).equals("/!"))) {
+        if ((windowsName.length() > 1) &&
+                (windowsName.substring(0, 2).equals("/!"))) {
             return toJavaAlt64Name(windowsName);
         }
-        StringBuffer javaName = new StringBuffer();
+        StringBuilder javaName = new StringBuilder();
         char ch;
         // Decode from simple encoding
-        for (int i = 0; i < windowsName.length(); i++){
+        for (int i = 0; i < windowsName.length(); i++) {
             if ((ch = windowsName.charAt(i)) == '/') {
                 char next = ' ';
                 if ((windowsName.length() > i + 1) &&
-                   ((next = windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
-                ch = next;
-                i++;
-                } else  if ((windowsName.length() > i + 1) && (next == '/')) {
-                ch = '\\';
-                i++;
+                        ((next = windowsName.charAt(i+1)) >= 'A') &&
+                        (next <= 'Z')) {
+                    ch = next;
+                    i++;
+                } else if ((windowsName.length() > i + 1) &&
+                           (next == '/')) {
+                    ch = '\\';
+                    i++;
                 }
             } else if (ch == '\\') {
                 ch = '/';
@@ -914,8 +935,8 @@
 
     private static String toJavaAlt64Name(String windowsName) {
         byte[] byteBuffer =
-                          Base64.altBase64ToByteArray(windowsName.substring(2));
-        StringBuffer result = new StringBuffer();
+                Base64.altBase64ToByteArray(windowsName.substring(2));
+        StringBuilder result = new StringBuilder();
         for (int i = 0; i < byteBuffer.length; i++) {
             int firstbyte = (byteBuffer[i++] & 0xff);
             int secondbyte =  (byteBuffer[i] & 0xff);
@@ -945,10 +966,10 @@
      * Base64 class.
      */
     private static byte[] toWindowsName(String javaName) {
-        StringBuffer windowsName = new StringBuffer();
+        StringBuilder windowsName = new StringBuilder();
         for (int i = 0; i < javaName.length(); i++) {
-            char ch =javaName.charAt(i);
-            if ((ch < 0x0020)||(ch > 0x007f)) {
+            char ch = javaName.charAt(i);
+            if ((ch < 0x0020) || (ch > 0x007f)) {
                 // If a non-trivial character encountered, use altBase64
                 return toWindowsAlt64Name(javaName);
             }
@@ -957,7 +978,7 @@
             } else if (ch == '/') {
                 windowsName.append('\\');
             } else if ((ch >= 'A') && (ch <='Z')) {
-                windowsName.append("/" + ch);
+                windowsName.append('/').append(ch);
             } else {
                 windowsName.append(ch);
             }
@@ -976,13 +997,13 @@
         // Convert to byte pairs
         int counter = 0;
         for (int i = 0; i < javaName.length();i++) {
-                int ch = javaName.charAt(i);
-                javaNameArray[counter++] = (byte)(ch >>> 8);
-                javaNameArray[counter++] = (byte)ch;
+            int ch = javaName.charAt(i);
+            javaNameArray[counter++] = (byte)(ch >>> 8);
+            javaNameArray[counter++] = (byte)ch;
         }
 
-        return stringToByteArray(
-                           "/!" + Base64.byteArrayToAltBase64(javaNameArray));
+        return stringToByteArray("/!" +
+                Base64.byteArrayToAltBase64(javaNameArray));
     }
 
     /**
@@ -994,30 +1015,31 @@
      private static String toJavaValueString(byte[] windowsNameArray) {
         // Use modified native2ascii algorithm
         String windowsName = byteArrayToString(windowsNameArray);
-        StringBuffer javaName = new StringBuffer();
+        StringBuilder javaName = new StringBuilder();
         char ch;
         for (int i = 0; i < windowsName.length(); i++){
             if ((ch = windowsName.charAt(i)) == '/') {
                 char next = ' ';
 
                 if (windowsName.length() > i + 1 &&
-                                    (next = windowsName.charAt(i + 1)) == 'u') {
-                    if (windowsName.length() < i + 6){
+                        (next = windowsName.charAt(i + 1)) == 'u') {
+                    if (windowsName.length() < i + 6) {
                         break;
                     } else {
-                        ch = (char)Integer.parseInt
-                                      (windowsName.substring(i + 2, i + 6), 16);
+                        ch = (char)Integer.parseInt(
+                                windowsName.substring(i + 2, i + 6), 16);
                         i += 5;
                     }
                 } else
                 if ((windowsName.length() > i + 1) &&
-                          ((windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
-                ch = next;
-                i++;
-                } else  if ((windowsName.length() > i + 1) &&
-                                               (next == '/')) {
-                ch = '\\';
-                i++;
+                        ((windowsName.charAt(i+1)) >= 'A') &&
+                        (next <= 'Z')) {
+                    ch = next;
+                    i++;
+                } else if ((windowsName.length() > i + 1) &&
+                        (next == '/')) {
+                    ch = '\\';
+                    i++;
                 }
             } else if (ch == '\\') {
                 ch = '/';
@@ -1037,14 +1059,14 @@
      * to convert java string to a byte array of ASCII characters.
      */
     private static byte[] toWindowsValueString(String javaName) {
-        StringBuffer windowsName = new StringBuffer();
+        StringBuilder windowsName = new StringBuilder();
         for (int i = 0; i < javaName.length(); i++) {
-            char ch =javaName.charAt(i);
-            if ((ch < 0x0020)||(ch > 0x007f)){
+            char ch = javaName.charAt(i);
+            if ((ch < 0x0020) || (ch > 0x007f)){
                 // write \udddd
                 windowsName.append("/u");
                 String hex = Integer.toHexString(javaName.charAt(i));
-                StringBuffer hex4 = new StringBuffer(hex);
+                StringBuilder hex4 = new StringBuilder(hex);
                 hex4.reverse();
                 int len = 4 - hex4.length();
                 for (int j = 0; j < len; j++){
@@ -1058,7 +1080,7 @@
             } else if (ch == '/') {
                 windowsName.append('\\');
             } else if ((ch >= 'A') && (ch <='Z')) {
-                windowsName.append("/" + ch);
+                windowsName.append('/').append(ch);
             } else {
                 windowsName.append(ch);
             }
@@ -1070,8 +1092,9 @@
      * Returns native handle for the top Windows node for this node.
      */
     private int rootNativeHandle() {
-        return (isUserNode()? USER_ROOT_NATIVE_HANDLE :
-                              SYSTEM_ROOT_NATIVE_HANDLE);
+        return (isUserNode()
+                ? USER_ROOT_NATIVE_HANDLE
+                : SYSTEM_ROOT_NATIVE_HANDLE);
     }
 
     /**
@@ -1090,7 +1113,7 @@
      * Converts a null-terminated byte array to java string
      */
     private static String byteArrayToString(byte[] array) {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         for (int i = 0; i < array.length - 1; i++) {
             result.append((char)array[i]);
         }
--- a/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java	Tue May 19 11:40:00 2015 -0700
@@ -32,7 +32,6 @@
 /**
  * The ExecOptionPermission class represents permission for rmid to use
  * a specific command-line option when launching an activation group.
- * <P>
  *
  * @author Ann Wollrath
  *
@@ -68,9 +67,9 @@
      * Checks if the specified permission is "implied" by
      * this object.
      * <P>
-     * More specifically, this method returns true if:<p>
+     * More specifically, this method returns true if:
      * <ul>
-     * <li> <i>p</i>'s class is the same as this object's class, and<p>
+     * <li> <i>p</i>'s class is the same as this object's class, and
      * <li> <i>p</i>'s name equals or (in the case of wildcards)
      *      is implied by this object's
      *      name. For example, "a.b.*" implies "a.b.c", and
@@ -111,7 +110,7 @@
      * Checks two ExecOptionPermission objects for equality.
      * Checks that <i>obj</i>'s class is the same as this object's class
      * and has the same name as this object.
-     * <P>
+     *
      * @param obj the object we are testing for equality with this object.
      * @return true if <i>obj</i> is an ExecOptionPermission, and has the same
      * name as this ExecOptionPermission object, false otherwise.
@@ -154,7 +153,7 @@
      * Returns a new PermissionCollection object for storing
      * ExecOptionPermission objects.
      * <p>
-     * A ExecOptionPermissionCollection stores a collection of
+     * An ExecOptionPermissionCollection stores a collection of
      * ExecOptionPermission permissions.
      *
      * <p>ExecOptionPermission objects must be stored in a manner that allows
--- a/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecPermission.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecPermission.java	Tue May 19 11:40:00 2015 -0700
@@ -40,14 +40,13 @@
  * all the files and directories contained in that directory. A pathname
  * that ends with "/-" indicates (recursively) all files
  * and subdirectories contained in that directory. A pathname consisting of
- * the special token "&lt;&lt;ALL FILES&gt;&gt;" matches <bold>any</bold> file.
+ * the special token "{@code <<ALL FILES>>}" matches <b>any</b> file.
  * <P>
  * Note: A pathname consisting of a single "*" indicates all the files
  * in the current directory, while a pathname consisting of a single "-"
  * indicates all the files in the current directory and
  * (recursively) all files and subdirectories contained in the current
  * directory.
- * <P>
  *
  *
  * @author Ann Wollrath
@@ -72,7 +71,7 @@
      * a directory and all the files contained in that directory. A pathname
      * that ends with "/-" indicates a directory and (recursively) all files
      * and subdirectories contained in that directory. The special pathname
-     * "&lt;&lt;ALL FILES&gt;&gt;" matches all files.
+     * "{@code <<ALL FILES>>}" matches all files.
      *
      * <p>A pathname consisting of a single "*" indicates all the files
      * in the current directory, while a pathname consisting of a single "-"
@@ -96,7 +95,7 @@
      * a directory and all the files contained in that directory. A pathname
      * that ends with "/-" indicates a directory and (recursively) all files
      * and subdirectories contained in that directory. The special pathname
-     * "&lt;&lt;ALL FILES&gt;&gt;" matches all files.
+     * "{@code <<ALL FILES>>}" matches all files.
      *
      * <p>A pathname consisting of a single "*" indicates all the files
      * in the current directory, while a pathname consisting of a single "-"
@@ -114,9 +113,9 @@
     /**
      * Checks if this ExecPermission object "implies" the specified permission.
      * <P>
-     * More specifically, this method returns true if:<p>
+     * More specifically, this method returns true if:
      * <ul>
-     * <li> <i>p</i> is an instanceof ExecPermission,<p> and
+     * <li> <i>p</i> is an instanceof ExecPermission, and
      * <li> <i>p</i>'s pathname is implied by this object's
      *      pathname. For example, "/tmp/*" implies "/tmp/foo", since
      *      "/tmp/*" encompasses the "/tmp" directory and all files in that
@@ -140,7 +139,7 @@
      * Checks two ExecPermission objects for equality.
      * Checks that <i>obj</i>'s class is the same as this object's class
      * and has the same name as this object.
-     * <P>
+     *
      * @param obj the object we are testing for equality with this object.
      * @return true if <i>obj</i> is an ExecPermission, and has the same
      * pathname as this ExecPermission object, false otherwise.
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/LogInputStream.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/LogInputStream.java	Tue May 19 11:40:00 2015 -0700
@@ -35,7 +35,7 @@
     /**
      * Creates a log input file with the specified system dependent
      * file descriptor.
-     * @param fd the system dependent file descriptor
+     * @param in the system dependent file descriptor
      * @param length the total number of bytes allowed to be read
      * @exception IOException If an I/O error has occurred.
      */
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/LogOutputStream.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/LogOutputStream.java	Tue May 19 11:40:00 2015 -0700
@@ -35,7 +35,7 @@
     /**
      * Creates an output file with the specified system dependent
      * file descriptor.
-     * @param fd the system dependent file descriptor
+     * @param raf the system dependent file descriptor.
      * @exception IOException If an I/O error has occurred.
      */
     public LogOutputStream(RandomAccessFile raf) throws IOException {
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/ReliableLog.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/ReliableLog.java	Tue May 19 11:40:00 2015 -0700
@@ -124,7 +124,7 @@
      * stable storage directory.
      *
      * @param dirPath path to the stable storage directory
-     * @param logCl the closure object containing callbacks for logging and
+     * @param handler the closure object containing callbacks for logging and
      * recovery
      * @param pad ignored
      * @exception IOException If a directory creation error has
@@ -170,8 +170,8 @@
      * stable storage directory.
      *
      * @param dirPath path to the stable storage directory
-     * @param logCl the closure object containing callbacks for logging and
-     * recovery
+     * @param handler the closure object containing callbacks for logging and
+     *        recovery
      * @exception IOException If a directory creation error has
      * occurred or if initialSnapshot callback raises an exception
      */
--- a/jdk/src/java.rmi/share/classes/sun/rmi/registry/RegistryImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/registry/RegistryImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -155,7 +155,7 @@
     /**
      * Returns the remote object for specified name in the registry.
      * @exception RemoteException If remote operation failed.
-     * @exception NotBound If name is not currently bound.
+     * @exception NotBoundException If name is not currently bound.
      */
     public Remote lookup(String name)
         throws RemoteException, NotBoundException
@@ -188,7 +188,7 @@
     /**
      * Unbind the name.
      * @exception RemoteException If remote operation failed.
-     * @exception NotBound If name is not currently bound.
+     * @exception NotBoundException If name is not currently bound.
      */
     public void unbind(String name)
         throws RemoteException, NotBoundException, AccessException
--- a/jdk/src/java.rmi/share/classes/sun/rmi/runtime/Log.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/runtime/Log.java	Tue May 19 11:40:00 2015 -0700
@@ -96,7 +96,7 @@
      * care to interpret a range of values between BRIEF, VERBOSE and
      * SILENT.
      *
-     * An override < 0 is interpreted to mean that the logging
+     * An override {@literal <} 0 is interpreted to mean that the logging
      * configuration should not be overridden. The level passed to the
      * factories createLog method will be null in this case.
      *
--- a/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -345,7 +345,7 @@
     * request.
     *
     * @param id the object's activation identifier
-    * @returns true if the operation succeeds (the operation will
+    * @return true if the operation succeeds (the operation will
     * succeed if the object in currently known to be active and is
     * either already unexported or is currently exported and has no
     * pending/executing calls); false is returned if the object has
@@ -430,7 +430,7 @@
      * hasn't already done so.
      *
      * @param id the object's identifier
-     * @param obj the remote object implementation
+     * @param impl the remote object implementation
      * @exception UnknownObjectException if object is not registered
      * @exception RemoteException if call informing monitor fails
      */
--- a/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupInit.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupInit.java	Tue May 19 11:40:00 2015 -0700
@@ -36,7 +36,7 @@
  * The activator spawns (as a child process) an activation group as needed
  * and directs activation requests to the appropriate activation
  * group. After spawning the VM, the activator passes some
- * information to the bootstrap code via its stdin: <p>
+ * information to the bootstrap code via its stdin:
  * <ul>
  * <li> the activation group's id,
  * <li> the activation group's descriptor (an instance of the class
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/Channel.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/Channel.java	Tue May 19 11:40:00 2015 -0700
@@ -42,7 +42,7 @@
 
     /**
      * Free the connection generated by this channel.
-     * @param c The connection
+     * @param conn The connection.
      * @param reuse If true, the connection is in a state in which it
      *        can be reused for another method call.
      */
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/LiveRef.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/LiveRef.java	Tue May 19 11:40:00 2015 -0700
@@ -56,7 +56,7 @@
 
     /**
      * Construct a "well-known" live reference to a remote object
-     * @param isLocalServer If true, indicates this ref specifies a local
+     * @param isLocal If true, indicates this ref specifies a local
      * server in this address space; if false, the ref is for a remote
      * object (hence a surrogate or proxy) in another address space.
      */
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java	Tue May 19 11:40:00 2015 -0700
@@ -81,7 +81,7 @@
 /**
  * The CGIHandler class contains methods for executing as a CGI program.
  * The main function interprets the query string as a command of the form
- * "<command>=<parameters>".
+ * "{@code <command>=<parameters>}".
  *
  * This class depends on the CGI 1.0 environment variables being set as
  * properties of the same name in this Java VM.
--- a/jdk/src/java.scripting/share/classes/javax/script/SimpleScriptContext.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.scripting/share/classes/javax/script/SimpleScriptContext.java	Tue May 19 11:40:00 2015 -0700
@@ -140,6 +140,7 @@
      * @throws IllegalArgumentException if the name is empty.
      */
     public Object getAttribute(String name) {
+        checkName(name);
         if (engineScope.containsKey(name)) {
             return getAttribute(name, ENGINE_SCOPE);
         } else if (globalScope != null && globalScope.containsKey(name)) {
@@ -162,7 +163,7 @@
      * @throws NullPointerException if the name is null.
      */
     public Object getAttribute(String name, int scope) {
-
+        checkName(name);
         switch (scope) {
 
             case ENGINE_SCOPE:
@@ -191,7 +192,7 @@
      * @throws NullPointerException if the name is null.
      */
     public Object removeAttribute(String name, int scope) {
-
+        checkName(name);
         switch (scope) {
 
             case ENGINE_SCOPE:
@@ -223,7 +224,7 @@
      * @throws NullPointerException if the name is null.
      */
     public void setAttribute(String name, Object value, int scope) {
-
+        checkName(name);
         switch (scope) {
 
             case ENGINE_SCOPE:
@@ -281,6 +282,7 @@
      * @throws IllegalArgumentException if name is empty.
      */
     public int getAttributesScope(String name) {
+        checkName(name);
         if (engineScope.containsKey(name)) {
             return ENGINE_SCOPE;
         } else if (globalScope != null && globalScope.containsKey(name)) {
@@ -314,6 +316,13 @@
         return scopes;
     }
 
+    private void checkName(String name) {
+        Objects.requireNonNull(name);
+        if (name.isEmpty()) {
+            throw new IllegalArgumentException("name cannot be empty");
+        }
+    }
+
     private static List<Integer> scopes;
     static {
         scopes = new ArrayList<Integer>(2);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java	Tue May 19 11:40:00 2015 -0700
@@ -1085,27 +1085,30 @@
      * Check if need to use DNS to locate Kerberos services for name. If not
      * defined, check dns_fallback, whose default value is true.
      */
-    private boolean useDNS(String name) {
+    private boolean useDNS(String name, boolean defaultValue) {
         Boolean value = getBooleanObject("libdefaults", name);
         if (value != null) {
             return value.booleanValue();
-        } else {
-            return getBooleanObject("libdefaults", "dns_fallback") != Boolean.FALSE;
         }
+        value = getBooleanObject("libdefaults", "dns_fallback");
+        if (value != null) {
+            return value.booleanValue();
+        }
+        return defaultValue;
     }
 
     /**
      * Check if need to use DNS to locate the KDC
      */
     private boolean useDNS_KDC() {
-        return useDNS("dns_lookup_kdc");
+        return useDNS("dns_lookup_kdc", true);
     }
 
     /*
      * Check if need to use DNS to locate the Realm
      */
     private boolean useDNS_Realm() {
-        return useDNS("dns_lookup_realm");
+        return useDNS("dns_lookup_realm", false);
     }
 
     /**
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/FilteredRowSetImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/FilteredRowSetImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -466,7 +466,7 @@
      *                        passed to the evaluate function.
      * 2. updateXXXstream() - here it would suffice to pass the stream handle
      *                        to the evaluate function and the implementation
-     *                        of the evaluate function can do the comparision
+     *                        of the evaluate function can do the comparison
      *                        based on the stream and also type of data.
      */
 
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JoinRowSetImpl.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JoinRowSetImpl.java	Tue May 19 11:40:00 2015 -0700
@@ -4063,14 +4063,16 @@
     }
 
     /**
-     * Provide interface coverage for getURL(int) in ResultSet->RowSet
+     * Provide interface coverage for getURL(int) in
+     * ResultSet{@literal ->}RowSet
      */
     public java.net.URL getURL(int columnIndex) throws SQLException {
         return crsInternal.getURL(columnIndex);
     }
 
     /**
-     * Provide interface coverage for getURL(String) in ResultSet->RowSet
+     * Provide interface coverage for getURL(String) in
+     * ResultSet{@literal ->}RowSet
      */
     public java.net.URL getURL(String columnName) throws SQLException {
         return crsInternal.getURL(columnName);
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/providers/RIOptimisticProvider.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/providers/RIOptimisticProvider.java	Tue May 19 11:40:00 2015 -0700
@@ -36,7 +36,7 @@
  * The reference implementation of a JDBC Rowset synchronization provider
  * providing optimistic synchronization with a relational datastore
  * using any JDBC technology-enabled driver.
- * <p>
+ *
  * <h3>1.0 Backgroud</h3>
  * This synchronization provider is registered with the
  * <code>SyncFactory</code> by default as the
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -67,7 +67,7 @@
      * value of this <code>SerialBlob</code> object.
      * @serial
      */
-    private byte buf[];
+    private byte[] buf;
 
     /**
      * The internal representation of the <code>Blob</code> object on which this
@@ -103,12 +103,13 @@
      * @throws SerialException if an error occurs during serialization
      * @throws SQLException if a SQL errors occurs
      */
-    public SerialBlob(byte[] b) throws SerialException, SQLException {
+    public SerialBlob(byte[] b)
+            throws SerialException, SQLException {
 
         len = b.length;
         buf = new byte[(int)len];
         for(int i = 0; i < len; i++) {
-           buf[i] = b[i];
+            buf[i] = b[i];
         }
         origLen = len;
     }
@@ -133,19 +134,17 @@
      *     to this constructor is a <code>null</code>.
      * @see java.sql.Blob
      */
-    public SerialBlob (Blob blob) throws SerialException, SQLException {
+    public SerialBlob (Blob blob)
+            throws SerialException, SQLException {
 
         if (blob == null) {
-            throw new SQLException("Cannot instantiate a SerialBlob " +
-                 "object with a null Blob object");
+            throw new SQLException(
+                    "Cannot instantiate a SerialBlob object with a null Blob object");
         }
 
         len = blob.length();
         buf = blob.getBytes(1, (int)len );
         this.blob = blob;
-
-         //if ( len < 10240000)
-         // len = 10240000;
         origLen = len;
     }
 
@@ -246,7 +245,8 @@
      *         value from the database
      */
     public long position(byte[] pattern, long start)
-                throws SerialException, SQLException {
+            throws SerialException, SQLException {
+
         isValid();
         if (start < 1 || start > len) {
             return -1;
@@ -291,7 +291,7 @@
      *         value from the database
      */
     public long position(Blob pattern, long start)
-       throws SerialException, SQLException {
+            throws SerialException, SQLException {
         isValid();
         return position(pattern.getBytes(1, (int)(pattern.length())), start);
     }
@@ -317,8 +317,8 @@
      * @see #getBytes
      */
     public int setBytes(long pos, byte[] bytes)
-        throws SerialException, SQLException {
-        return (setBytes(pos, bytes, 0, bytes.length));
+            throws SerialException, SQLException {
+        return setBytes(pos, bytes, 0, bytes.length);
     }
 
     /**
@@ -353,7 +353,7 @@
      * @see #getBytes
      */
     public int setBytes(long pos, byte[] bytes, int offset, int length)
-        throws SerialException, SQLException {
+            throws SerialException, SQLException {
 
         isValid();
         if (offset < 0 || offset > bytes.length) {
@@ -370,7 +370,7 @@
 
         if ((length + offset) > bytes.length) {
             throw new SerialException("Invalid OffSet. Cannot have combined offset " +
-                "and length that is greater that the Blob buffer");
+                    "and length that is greater that the Blob buffer");
         }
 
         int i = 0;
@@ -403,7 +403,8 @@
      * @see #getBinaryStream
      */
     public java.io.OutputStream setBinaryStream(long pos)
-        throws SerialException, SQLException {
+            throws SerialException, SQLException {
+
         isValid();
         if (this.blob != null) {
             return this.blob.setBinaryStream(pos);
@@ -426,17 +427,16 @@
      * if {@code free} had previously been called on this object
      */
     public void truncate(long length) throws SerialException {
-
         isValid();
         if (length > len) {
-           throw new SerialException
-              ("Length more than what can be truncated");
+            throw new SerialException(
+                    "Length more than what can be truncated");
         } else if((int)length == 0) {
-             buf = new byte[0];
-             len = length;
+            buf = new byte[0];
+            len = length;
         } else {
-             len = length;
-             buf = this.getBytes(1, (int)len);
+            len = length;
+            buf = this.getBytes(1, (int)len);
         }
     }
 
@@ -467,8 +467,8 @@
             throw new SerialException("Invalid position in BLOB object set");
         }
         if (length < 1 || length > len - pos + 1) {
-            throw new SerialException("length is < 1 or pos + length >"
-                    + "total number of bytes");
+            throw new SerialException(
+                    "length is < 1 or pos + length > total number of bytes");
         }
         return new ByteArrayInputStream(buf, (int) pos - 1, (int) length);
     }
@@ -537,14 +537,13 @@
     public Object clone() {
         try {
             SerialBlob sb = (SerialBlob) super.clone();
-            sb.buf =  (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
+            sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
             sb.blob = null;
             return sb;
         } catch (CloneNotSupportedException ex) {
             // this shouldn't happen, since we are Cloneable
             throw new InternalError();
         }
-
     }
 
     /**
@@ -555,15 +554,15 @@
             throws IOException, ClassNotFoundException {
 
         ObjectInputStream.GetField fields = s.readFields();
-       byte[] tmp = (byte[])fields.get("buf", null);
-       if (tmp == null)
-           throw new InvalidObjectException("buf is null and should not be!");
-       buf = tmp.clone();
-       len = fields.get("len", 0L);
-       if (buf.length != len)
-           throw new InvalidObjectException("buf is not the expected size");
-       origLen = fields.get("origLen", 0L);
-       blob = (Blob) fields.get("blob", null);
+        byte[] tmp = (byte[])fields.get("buf", null);
+        if (tmp == null)
+            throw new InvalidObjectException("buf is null and should not be!");
+        buf = tmp.clone();
+        len = fields.get("len", 0L);
+        if (buf.length != len)
+            throw new InvalidObjectException("buf is not the expected size");
+        origLen = fields.get("origLen", 0L);
+        blob = (Blob) fields.get("blob", null);
     }
 
     /**
@@ -591,8 +590,8 @@
      */
     private void isValid() throws SerialException {
         if (buf == null) {
-            throw new SerialException("Error: You cannot call a method on a "
-                    + "SerialBlob instance once free() has been called.");
+            throw new SerialException("Error: You cannot call a method on a " +
+                    "SerialBlob instance once free() has been called.");
         }
     }
 
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/IgnoreAllErrorHandler.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/IgnoreAllErrorHandler.java	Tue May 19 11:40:00 2015 -0700
@@ -35,19 +35,30 @@
 public class IgnoreAllErrorHandler implements ErrorHandler {
 
     /** {@link org.apache.commons.logging} logging facility */
-    private static java.util.logging.Logger log =
+    private static final java.util.logging.Logger log =
         java.util.logging.Logger.getLogger(IgnoreAllErrorHandler.class.getName());
 
     /** Field throwExceptions */
-    private static final boolean warnOnExceptions =
-        System.getProperty("com.sun.org.apache.xml.internal.security.test.warn.on.exceptions", "false").equals("true");
+    private static final boolean warnOnExceptions = getProperty(
+            "com.sun.org.apache.xml.internal.security.test.warn.on.exceptions");
 
     /** Field throwExceptions           */
-    private static final boolean throwExceptions =
-        System.getProperty("com.sun.org.apache.xml.internal.security.test.throw.exceptions", "false").equals("true");
+    private static final boolean throwExceptions = getProperty(
+            "com.sun.org.apache.xml.internal.security.test.throw.exceptions");
+
+    private static boolean getProperty(String name) {
+        return java.security.AccessController.doPrivileged(
+                new java.security.PrivilegedAction<Boolean>() {
 
+                    @Override
+                    public Boolean run() {
+                        return Boolean.getBoolean(name);
+                    }
+                });
+    }
 
     /** @inheritDoc */
+    @Override
     public void warning(SAXParseException ex) throws SAXException {
         if (IgnoreAllErrorHandler.warnOnExceptions) {
             log.log(java.util.logging.Level.WARNING, "", ex);
@@ -59,6 +70,7 @@
 
 
     /** @inheritDoc */
+    @Override
     public void error(SAXParseException ex) throws SAXException {
         if (IgnoreAllErrorHandler.warnOnExceptions) {
             log.log(java.util.logging.Level.SEVERE, "", ex);
@@ -70,6 +82,7 @@
 
 
     /** @inheritDoc */
+    @Override
     public void fatalError(SAXParseException ex) throws SAXException {
         if (IgnoreAllErrorHandler.warnOnExceptions) {
             log.log(java.util.logging.Level.WARNING, "", ex);
--- a/jdk/src/jdk.hprof.agent/unix/native/libhprof/hprof_md.c	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/jdk.hprof.agent/unix/native/libhprof/hprof_md.c	Tue May 19 11:40:00 2015 -0700
@@ -290,19 +290,7 @@
     Dl_info dlinfo;
 
     libdir[0] = 0;
-#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX)
-    addr = (void*)&Agent_OnLoad;
-#else
-    /* Just using &Agent_OnLoad will get the first external symbol with
-     *   this name in the first .so, which may not be libhprof.so.
-     *   On Solaris we can actually ask for the address of our Agent_OnLoad.
-     */
-    addr = dlsym(RTLD_SELF, "Agent_OnLoad");
-    /* Just in case the above didn't work (missing linker patch?). */
-    if ( addr == NULL ) {
-        addr = (void*)&Agent_OnLoad;
-    }
-#endif
+    addr = (void*)&md_get_prelude_path;
 
     /* Use dladdr() to get the full path to libhprof.so, which we use to find
      *  the prelude file.
--- a/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java	Tue May 19 11:40:00 2015 -0700
@@ -79,7 +79,7 @@
      * Examine and consume command line arguments.
      * @param argv The command line arguments. Ignore null
      * and unknown arguments. Set each consumed argument to null.
-     * @param error Report any errors using the main.error() methods.
+     * @param main Report any errors using the main.error() methods.
      * @return true if no errors, false otherwise.
      */
     public boolean parseArgs(String argv[], Main main) {
--- a/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java	Tue May 19 11:40:00 2015 -0700
@@ -111,7 +111,7 @@
      * the remote methods implemented by this class, i.e. all of the
      * methods in the class's remote interfaces.
      *
-     * The methods in the array are ordered according to the comparision
+     * The methods in the array are ordered according to the comparison
      * of the strings consisting of their method name followed by their
      * type signature, so each method's index in the array corresponds
      * to its "operation number" in the JDK 1.1 version of the
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/Character/UnicodeBlock/NonOptimalMapSize.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/**
+ * @test
+ * @bug 8080535
+ * @summary Expected size of Character.UnicodeBlock.map is not optimal
+ */
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+public class NonOptimalMapSize {
+    public static void main(String[] args) throws Throwable {
+        Class<?> ubCls = Character.UnicodeBlock.class;
+        Field mapField = ubCls.getDeclaredField("map");
+        mapField.setAccessible(true);
+        Map<?,?> map = (Map<?,?>)mapField.get(null);
+        if (!map.getClass().equals(HashMap.class)) {
+            throw new RuntimeException(
+                    "Character.UnicodeBlock.map is expected to be HashMap");
+        }
+        int mapSize = map.size();
+
+        Field sizeField = ubCls.getDeclaredField("INITIAL_CAPACITY");
+        sizeField.setAccessible(true);
+        int INITIAL_CAPACITY = sizeField.getInt(null);
+
+        // Construct a HashMap with specified initial capacity
+        HashMap<Object,Object> map1 = new HashMap<>(INITIAL_CAPACITY);
+        Class<?> hmCls = HashMap.class;
+        Field tableField = hmCls.getDeclaredField("table");
+        tableField.setAccessible(true);
+        // ... and fill it up
+        map1.put(new Object(), new Object());
+        final Object initialTable = tableField.get(map1);
+        while (map1.size() < map.size() &&
+                initialTable == tableField.get(map1)) {
+            map1.put(new Object(), new Object());
+        }
+
+        // Now check that internal storage didn't change
+        if (initialTable != tableField.get(map1)) {
+            throw new RuntimeException(
+                    "Initial capacity " + INITIAL_CAPACITY +
+                    " was only enough to hold " + (map1.size()-1) +
+                    " entries, but needed " + map.size());
+        }
+    }
+}
--- a/jdk/test/java/lang/SecurityManager/CheckSecurityProvider.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/java/lang/SecurityManager/CheckSecurityProvider.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -67,6 +67,7 @@
         expected.add("com.sun.security.sasl.Provider");
         expected.add("org.jcp.xml.dsig.internal.dom.XMLDSigRI");
         expected.add("sun.security.smartcardio.SunPCSC");
+        expected.add("sun.security.provider.certpath.ldap.JdkLDAP");
         if (os.startsWith("Windows")) {
             expected.add("sun.security.mscapi.SunMSCAPI");
         }
--- a/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java	Tue May 19 11:40:00 2015 -0700
@@ -72,12 +72,6 @@
             final int catchDrops) {
         this.testCase = testCase;
         this.dropped = catchDrops;
-        if (Helper.IS_VERBOSE) {
-            System.out.printf("CatchException::CatchException(%s, isVararg=%b " +
-                            "argsCount=%d catchDrops=%d)%n",
-                    testCase, isVararg, argsCount, catchDrops
-            );
-        }
         MethodHandle thrower = testCase.thrower;
         int throwerLen = thrower.type().parameterCount();
         List<Class<?>> classes;
@@ -97,9 +91,11 @@
     }
 
     public static void main(String[] args) throws Throwable {
+        System.out.println("classes = " + ARGS_CLASSES);
+
         TestFactory factory = new TestFactory();
         long timeout = Helper.IS_THOROUGH ? 0L : Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT);
-        // substract vm init time and reserve time for vm exit
+        // subtract vm init time and reserve time for vm exit
         timeout *= 0.9;
         TimeLimitedRunner runner = new TimeLimitedRunner(timeout, 2.0d,
                 () -> {
@@ -131,6 +127,12 @@
     }
 
     private void runTest() {
+        if (Helper.IS_VERBOSE) {
+            System.out.printf("CatchException(%s, isVararg=%b argsCount=%d " +
+                            "dropped=%d)%n",
+                    testCase, thrower.isVarargsCollector(), argsCount, dropped);
+        }
+
         Helper.clear();
 
         Object[] args = Helper.randomArgs(
@@ -212,10 +214,7 @@
             args = 1;
         }
 
-        if (Helper.IS_VERBOSE) {
-            System.out.printf("maxArgs = %d%nmaxDrops = %d%n",
-                    maxArgs, maxDrops);
-        }
+        System.out.printf("maxArgs = %d%nmaxDrops = %d%n", maxArgs, maxDrops);
         constructorSize = TestCase.CONSTRUCTORS.size();
     }
 
@@ -243,7 +242,7 @@
 
     /**
      * @return next test from test matrix:
-     * {varArgs, noVarArgs} x TestCase.rtypes x TestCase.THROWABLES x {1, .., maxArgs } x {1, .., maxDrops}
+     * {varArgs, noVarArgs} x TestCase.rtypes x TestCase.THROWABLES x {1, .., maxArgs } x {0, .., maxDrops}
      */
     public CatchExceptionTest nextTest() {
         if (constructor < constructorSize) {
@@ -256,7 +255,7 @@
             return null;
         }
         if (dropArgs <= currentMaxDrops) {
-            if (dropArgs == 1) {
+            if (dropArgs == 0) {
                 if (Helper.IS_THOROUGH || Helper.RNG.nextBoolean()) {
                     ++dropArgs;
                     return createTest();
@@ -271,8 +270,8 @@
             }
         }
 
-        if (args <= maxArgs) {
-            dropArgs = 1;
+        if (args < maxArgs) {
+            dropArgs = 0;
             currentMaxDrops = Math.min(args, maxDrops);
             ++args;
             return createTest();
--- a/jdk/test/java/nio/file/Files/SBC.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/java/nio/file/Files/SBC.java	Tue May 19 11:40:00 2015 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4313887 8066915
+ * @bug 4313887
  * @summary Unit test for java.nio.file.Files.newByteChannel
  * @library ..
  */
@@ -59,7 +59,6 @@
                 dosSharingOptionTests(dir);
 
             // misc. tests
-            directoryOpenTests(dir);
             badCombinations(dir);
             unsupportedOptions(dir);
             nullTests(dir);
@@ -279,21 +278,6 @@
         }
     }
 
-    // test opening a directory for read or write
-    static void directoryOpenTests(Path dir) throws Exception {
-        try (SeekableByteChannel sbc = Files.newByteChannel(dir, READ)) {
-            throw new RuntimeException("Opened directory for read");
-        } catch (IOException expected) { }
-
-        try (SeekableByteChannel sbc = Files.newByteChannel(dir, WRITE)) {
-            throw new RuntimeException("Opened directory for write");
-        } catch (IOException expected) { }
-
-        try (SeekableByteChannel sbc = Files.newByteChannel(dir, APPEND)) {
-            throw new RuntimeException("Opened directory for append ");
-        } catch (IOException expected) { }
-    }
-
     // Windows specific options for the use by applications that really want
     // to use legacy DOS sharing options
     static void dosSharingOptionTests(Path dir) throws Exception {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/URICertStoreParameters/TestBasic.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.cert.CertStore;
+import java.security.cert.URICertStoreParameters;
+import java.net.URI;
+
+/*
+ * @test
+ * @bug 8038084
+ * @summary Basic testing for URICertStoreParameters
+ * @run main TestBasic
+ */
+public class TestBasic {
+
+    public static void main(String[] args) throws Exception {
+        String str1 = "ldap://myownhost:5000/";
+        String str2 = "ldap://myownhost:5000/cn=foo";
+        test(str1, str2);
+        System.out.println("Test passed");
+    }
+
+    private static void test(String str1, String str2) throws Exception {
+        System.out.println("Testing clone");
+        URICertStoreParameters p1 = new URICertStoreParameters(new URI(str1));
+        URICertStoreParameters p1Too = p1.clone();
+        if (!(p1.getURI().equals(p1Too.getURI())) ||
+            !(p1.equals(p1Too))) {
+            throw new Exception("Error: problem with clone");
+        }
+        System.out.println("Testing equal and hashCode");
+        p1Too = new URICertStoreParameters(new URI(str1));
+        URICertStoreParameters p2 = new URICertStoreParameters(new URI(str2));
+
+        if (p1.equals(null)) {
+            throw new Exception("Error: p1 should NOT equal null");
+        }
+        if ((!p1.equals(p1)) || (p1.hashCode() != p1.hashCode())) {
+            throw new Exception("Error: p1 should equal p1");
+        }
+        if ((!p1.equals(p1Too)) || (p1.hashCode() != p1Too.hashCode())) {
+            throw new Exception("Error: p1 should equal p1Too");
+        }
+        if ((!p1Too.equals(p1)) || (p1Too.hashCode() != p1.hashCode())) {
+            throw new Exception("Error: p1Too should equal p1");
+        }
+        if (p1.equals(p2) || p1Too.equals(p2)) {
+            throw new Exception("Error: p1/p1Too should NOT equal p2");
+        }
+    }
+}
--- a/jdk/test/java/util/Map/Collisions.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/java/util/Map/Collisions.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -198,138 +198,125 @@
     }
 
     private static <T> void testInsertion(Map<T, T> map, String keys_desc, T[] keys) {
-        check("map empty", (map.size() == 0) && map.isEmpty());
+        check(map.size() == 0 && map.isEmpty(), "map empty");
 
         for (int i = 0; i < keys.length; i++) {
-            check(String.format("insertion: map expected size m%d != i%d", map.size(), i),
-                    map.size() == i);
-            check(String.format("insertion: put(%s[%d])", keys_desc, i), null == map.put(keys[i], keys[i]));
-            check(String.format("insertion: containsKey(%s[%d])", keys_desc, i), map.containsKey(keys[i]));
-            check(String.format("insertion: containsValue(%s[%d])", keys_desc, i), map.containsValue(keys[i]));
+            check(map.size() == i, "insertion: map expected size m%d != i%d", map.size(), i);
+            check(null == map.put(keys[i], keys[i]), "insertion: put(%s[%d])", keys_desc, i);
+            check(map.containsKey(keys[i]), "insertion: containsKey(%s[%d])", keys_desc, i);
+            check(map.containsValue(keys[i]), "insertion: containsValue(%s[%d])", keys_desc, i);
         }
 
-        check(String.format("map expected size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "map expected size m%d != k%d", map.size(), keys.length);
     }
 
     private static void testIntegerIteration(Map<HashableInteger, HashableInteger> map, HashableInteger[] keys) {
-        check(String.format("map expected size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "map expected size m%d != k%d", map.size(), keys.length);
 
         BitSet all = new BitSet(keys.length);
         for (Map.Entry<HashableInteger, HashableInteger> each : map.entrySet()) {
-            check("Iteration: key already seen", !all.get(each.getKey().value));
+            check(!all.get(each.getKey().value), "Iteration: key already seen");
             all.set(each.getKey().value);
         }
 
         all.flip(0, keys.length);
-        check("Iteration: some keys not visited", all.isEmpty());
+        check(all.isEmpty(), "Iteration: some keys not visited");
 
         for (HashableInteger each : map.keySet()) {
-            check("Iteration: key already seen", !all.get(each.value));
+            check(!all.get(each.value), "Iteration: key already seen");
             all.set(each.value);
         }
 
         all.flip(0, keys.length);
-        check("Iteration: some keys not visited", all.isEmpty());
+        check(all.isEmpty(), "Iteration: some keys not visited");
 
         int count = 0;
         for (HashableInteger each : map.values()) {
             count++;
         }
 
-        check(String.format("Iteration: value count matches size m%d != c%d", map.size(), count),
-                map.size() == count);
+        check(map.size() == count, "Iteration: value count matches size m%d != c%d", map.size(), count);
     }
 
     private static void testStringIteration(Map<String, String> map, String[] keys) {
-        check(String.format("map expected size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "map expected size m%d != k%d", map.size(), keys.length);
 
         BitSet all = new BitSet(keys.length);
         for (Map.Entry<String, String> each : map.entrySet()) {
             String key = each.getKey();
             boolean longKey = key.length() > 5;
             int index = key.hashCode() + (longKey ? keys.length / 2 : 0);
-            check("key already seen", !all.get(index));
+            check(!all.get(index), "key already seen");
             all.set(index);
         }
 
         all.flip(0, keys.length);
-        check("some keys not visited", all.isEmpty());
+        check(all.isEmpty(), "some keys not visited");
 
         for (String each : map.keySet()) {
             boolean longKey = each.length() > 5;
             int index = each.hashCode() + (longKey ? keys.length / 2 : 0);
-            check("key already seen", !all.get(index));
+            check(!all.get(index), "key already seen");
             all.set(index);
         }
 
         all.flip(0, keys.length);
-        check("some keys not visited", all.isEmpty());
+        check(all.isEmpty(), "some keys not visited");
 
         int count = 0;
         for (String each : map.values()) {
             count++;
         }
 
-        check(String.format("value count matches size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "value count matches size m%d != k%d", map.size(), keys.length);
     }
 
     private static <T> void testContainsKey(Map<T, T> map, String keys_desc, T[] keys) {
         for (int i = 0; i < keys.length; i++) {
             T each = keys[i];
-            check("containsKey: " + keys_desc + "[" + i + "]" + each, map.containsKey(each));
+            check(map.containsKey(each), "containsKey: %s[%d]%s", keys_desc, i, each);
         }
     }
 
     private static <T> void testRemove(Map<T, T> map, String keys_desc, T[] keys) {
-        check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
 
         for (int i = 0; i < keys.length; i++) {
             T each = keys[i];
-            check("remove: " + keys_desc + "[" + i + "]" + each, null != map.remove(each));
+            check(null != map.remove(each), "remove: %s[%d]%s", keys_desc, i, each);
         }
 
-        check(String.format("remove: map empty. size=%d", map.size()),
-                (map.size() == 0) && map.isEmpty());
+        check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
     }
 
     private static <T> void testKeysIteratorRemove(Map<T, T> map, String keys_desc, T[] keys) {
-        check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
 
         Iterator<T> each = map.keySet().iterator();
         while (each.hasNext()) {
             T t = each.next();
             each.remove();
-            check("not removed: " + each, !map.containsKey(t) );
+            check(!map.containsKey(t), "not removed: %s", each);
         }
 
-        check(String.format("remove: map empty. size=%d", map.size()),
-                (map.size() == 0) && map.isEmpty());
+        check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
     }
 
     private static <T> void testValuesIteratorRemove(Map<T, T> map, String keys_desc, T[] keys) {
-        check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
 
         Iterator<T> each = map.values().iterator();
         while (each.hasNext()) {
             T t = each.next();
             each.remove();
-            check("not removed: " + each, !map.containsValue(t) );
+            check(!map.containsValue(t), "not removed: %s", each);
         }
 
-        check(String.format("remove: map empty. size=%d", map.size()),
-                (map.size() == 0) && map.isEmpty());
+        check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
     }
 
     private static <T> void testEntriesIteratorRemove(Map<T, T> map, String keys_desc, T[] keys) {
-        check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
-                map.size() == keys.length);
+        check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
 
         Iterator<Map.Entry<T,T>> each = map.entrySet().iterator();
         while (each.hasNext()) {
@@ -337,13 +324,12 @@
             T key = t.getKey();
             T value = t.getValue();
             each.remove();
-            check("not removed: " + each, (map instanceof IdentityHashMap) || !map.entrySet().contains(t) );
-            check("not removed: " + each, !map.containsKey(key) );
-            check("not removed: " + each, !map.containsValue(value));
+            check((map instanceof IdentityHashMap) || !map.entrySet().contains(t), "not removed: %s", each);
+            check(!map.containsKey(key),                                           "not removed: %s", each);
+            check(!map.containsValue(value),                                       "not removed: %s", each);
         }
 
-        check(String.format("remove: map empty. size=%d", map.size()),
-                (map.size() == 0) && map.isEmpty());
+        check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
     }
 
     //--------------------- Infrastructure ---------------------------
@@ -391,7 +377,7 @@
         }
     }
 
-    static void check(String desc, boolean cond) {
+    static void check(boolean cond, String desc) {
         if (cond) {
             pass();
         } else {
@@ -399,6 +385,46 @@
         }
     }
 
+    static void check(boolean cond, String fmt, int i) {
+        if (cond) {
+            pass();
+        } else {
+            fail(String.format(fmt, i));
+        }
+    }
+
+    static void check(boolean cond, String fmt, Object o) {
+        if (cond) {
+            pass();
+        } else {
+            fail(String.format(fmt, o));
+        }
+    }
+
+    static void check(boolean cond, String fmt, int i1, int i2) {
+        if (cond) {
+            pass();
+        } else {
+            fail(String.format(fmt, i1, i2));
+        }
+    }
+
+    static void check(boolean cond, String fmt, String s, int i) {
+        if (cond) {
+            pass();
+        } else {
+            fail(String.format(fmt, s, i));
+        }
+    }
+
+    static void check(boolean cond, String fmt, String s, int i, Object o) {
+        if (cond) {
+            pass();
+        } else {
+            fail(String.format(fmt, s, i, o));
+        }
+    }
+
     static void equal(Object x, Object y) {
         if (Objects.equals(x, y)) {
             pass();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/LogManager/Configuration/TestConfigurationLock.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,457 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.LockInfo;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MonitorInfo;
+import java.lang.management.ThreadInfo;
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
+
+
+/**
+ * @test
+ * @bug 8077846
+ * @key randomness
+ * @summary Test that using a reentrant configuration lock does not introduce
+ *       new synchronization issues in Logger and LogManager. This test
+ *       focuses more particularly on potential deadlock in
+ *       drainLoggerRefQueueBounded / readConfiguration / reset
+ *       todo: add at randomness
+ * @run main/othervm TestConfigurationLock
+ * @author danielfuchs
+ */
+// This test is a best effort to try & detect issues. The test itself will run
+// for 8secs. This might be unsufficient to detect issues.
+// To get a greater confidence it is recommended to run this test in a loop:
+// e.g. use something like:
+// $ while jtreg -jdk:$JDK -verbose:all  \
+//      test/java/util/logging/TestConfigurationLock.java ; \
+//      do echo Running test again ; done
+// and let it run for a few hours...
+//
+public class TestConfigurationLock {
+
+    static volatile Exception thrown = null;
+    static volatile boolean goOn = true;
+    static volatile boolean deadlock = false;
+
+    static final double CONFSYNCTHRESHOLD = 0.3;
+    static final double LOGSYNCTHRESHOLD = 0.3;
+    static final int RESETERS = 0;
+    static final int READERS = 3;
+    static final int LOGGERS = 4;
+    static final long TIME = 8 * 1000; // 8 sec.
+    static final long STEP = 1 * 1000;  // message every 1 sec.
+    static final int  LCOUNT = 50; // 50 loggers created in a row...
+    static final AtomicLong nextLogger = new AtomicLong(0);
+    static final AtomicLong resetCount = new AtomicLong(0);
+    static final AtomicLong readCount = new AtomicLong(0);
+    static final AtomicLong checkCount = new AtomicLong(0);
+
+    static final String BLAH = "blah";
+
+    static Object fakeConfExternalLock() {
+        return LogManager.getLogManager();
+    }
+
+    static Object fakeLogExternalLock() {
+        return LogManager.getLogManager();
+    }
+
+
+     /**
+     * This test will run both with and without a security manager.
+     *
+     * The test starts a number of threads that will call
+     *     LogManager.reset() concurrently (ResetConf), and a number of threads
+     *     that will call readConfiguration() (ReadConf), and then starts a
+     *     number of threads that will create new loggers concurrently
+     *     (AddLogger), and finally two additional threads:
+     *     - one (Stopper) that will stop the test after 4secs (TIME ms),
+     *     - and one DeadlockDetector that will attempt to detect deadlocks.
+     * If after 4secs no deadlock was detected and no exception was thrown
+     * then the test is considered a success and passes.
+     *
+     * This procedure is done twice: once without a security manager and once
+     * again with a security manager - which means the test takes ~8secs to
+     * run.
+     *
+     * Note that 8sec may not be enough to detect issues if there are some.
+     * This is a best effort test.
+     *
+     * @param args the command line arguments
+     * @throws java.lang.Exception if the test fails
+     */
+    public static void main(String[] args) throws Exception {
+
+        File conf = new File(System.getProperty("test.src", "./src"),
+                TestConfigurationLock.class.getSimpleName() + ".properties");
+        if (!conf.canRead()) {
+            throw new IOException("Can't read config file: " + conf.getAbsolutePath());
+        }
+        System.setProperty("java.util.logging.config.file", conf.getAbsolutePath());
+        // test without security
+        System.out.println("No security");
+        test();
+
+        // test with security
+        System.out.println("\nWith security");
+        Policy.setPolicy(new Policy() {
+            @Override
+            public boolean implies(ProtectionDomain domain, Permission permission) {
+                if (super.implies(domain, permission)) return true;
+                // System.out.println("Granting " + permission);
+                return true; // all permissions
+            }
+        });
+        System.setSecurityManager(new SecurityManager());
+        test();
+    }
+
+
+    /**
+     * Starts all threads, wait 4secs, then stops all threads.
+     * @throws Exception if a deadlock was detected or an error occurred.
+     */
+    public static void test() throws Exception {
+          goOn = true;
+          thrown = null;
+          long sNextLogger = nextLogger.get();
+          long sUpdateCount  = resetCount.get();
+          long sReadCount  = readCount.get();
+          long sCheckCount = checkCount.get();
+          List<Thread> threads = new ArrayList<>();
+          for (int i = 0; i<RESETERS; i++) {
+              threads.add(new ResetConf());
+          }
+          for (int i = 0; i<READERS; i++) {
+              threads.add(new ReadConf());
+          }
+          for (int i = 0; i<LOGGERS; i++) {
+              threads.add(new AddLogger());
+          }
+          threads.add(0, new Stopper(TIME));
+          threads.stream().forEach(Thread::start);
+
+          Thread deadLockDetector = new DeadlockDetector();
+          deadLockDetector.start();
+          deadLockDetector.join();
+
+          if (!deadlock) {
+              threads.stream().forEach(TestConfigurationLock::join);
+          } else {
+              System.err.println("Deadlock found: exiting forcibly.");
+              Runtime.getRuntime().halt(-1);
+          }
+
+          if (thrown != null) {
+              throw thrown;
+          }
+          System.out.println("Passed: " + (nextLogger.get() - sNextLogger)
+                  + " loggers created by " + LOGGERS + " Thread(s),");
+          System.out.println("\t LogManager.reset() called "
+                  + (resetCount.get() - sUpdateCount) + " times by " + RESETERS
+                  + " Thread(s).");
+          System.out.println("\t LogManager.readConfiguration() called "
+                  + (readCount.get() - sReadCount) + " times by " + READERS
+                  + " Thread(s).");
+          System.out.println("\t ThreadMXBean.findDeadlockedThreads called "
+                  + (checkCount.get() -sCheckCount) + " times by 1 Thread.");
+
+    }
+
+    static void join(Thread t) {
+        try {
+            t.join();
+        } catch (Exception x) {
+            fail(x);
+        }
+    }
+
+    final static class ResetConf extends Thread {
+
+        public ResetConf() {
+            setDaemon(true);
+        }
+
+        @Override
+        public void run() {
+            while (goOn) {
+                try {
+                    if (Math.random() > CONFSYNCTHRESHOLD) {
+                        // calling reset while holding a lock can increase
+                        // deadlock probability...
+                        synchronized(fakeConfExternalLock()) {
+                            LogManager.getLogManager().reset();
+                        }
+                    } else {
+                        LogManager.getLogManager().reset();
+                    }
+                    Logger blah = Logger.getLogger(BLAH);
+                    blah.setLevel(Level.FINEST);
+                    blah.fine(BLAH);
+                    resetCount.incrementAndGet();
+                    pause(1);
+                } catch (Exception x) {
+                    fail(x);
+                }
+            }
+        }
+    }
+
+    final static class ReadConf extends Thread {
+
+        public ReadConf() {
+            setDaemon(true);
+        }
+
+        @Override
+        public void run() {
+            while (goOn) {
+                try {
+                    if (Math.random() > CONFSYNCTHRESHOLD) {
+                        // calling readConfiguration while holding a lock can
+                        // increase deadlock probability...
+                        synchronized(fakeConfExternalLock()) {
+                            LogManager.getLogManager().readConfiguration();
+                        }
+                    } else {
+                        LogManager.getLogManager().readConfiguration();
+                    }
+                    Logger blah = Logger.getLogger(BLAH);
+                    blah.setLevel(Level.FINEST);
+                    blah.fine(BLAH);
+                    readCount.incrementAndGet();
+                    pause(1);
+                } catch (Exception x) {
+                    fail(x);
+                }
+            }
+        }
+    }
+
+    final static class AddLogger extends Thread {
+
+        public AddLogger() {
+            setDaemon(true);
+        }
+
+        @Override
+        public void run() {
+            try {
+                while (goOn) {
+                    Logger l;
+                    Logger foo = Logger.getLogger("foo");
+                    Logger bar = Logger.getLogger("foo.bar");
+                    for (int i=0; i < LCOUNT ; i++) {
+                        LogManager manager = LogManager.getLogManager();
+                        if (Math.random() > LOGSYNCTHRESHOLD) {
+                            synchronized(fakeLogExternalLock()) {
+                                l = Logger.getLogger("foo.bar.l"+nextLogger.incrementAndGet());
+                            }
+                        } else {
+                            l = Logger.getLogger("foo.bar.l"+nextLogger.incrementAndGet());
+                        }
+                        l.setLevel(Level.FINEST);
+                        l.fine("I'm fine");
+                        if (!goOn) break;
+                        pause(1);
+                    }
+                }
+            } catch (InterruptedException | RuntimeException x ) {
+                fail(x);
+            }
+        }
+    }
+
+    final static class DeadlockDetector extends Thread {
+
+        @Override
+        public void run() {
+            boolean deadlock = false;
+            while(goOn) {
+                try {
+                    long[] ids = ManagementFactory.getThreadMXBean().findDeadlockedThreads();
+                    checkCount.incrementAndGet();
+                    ids = ids == null ? new long[0] : ids;
+                    if (ids.length == 1) {
+                        throw new RuntimeException("Found 1 deadlocked thread: "+ids[0]);
+                    } else if (ids.length > 0) {
+                        deadlock = true;
+                        ThreadInfo[] infos = ManagementFactory.getThreadMXBean()
+                            .getThreadInfo(ids, true, true);
+                        System.err.println("Found "+ids.length+" deadlocked threads: ");
+                        for (ThreadInfo inf : infos) {
+                            System.err.println(asString(inf));
+                        }
+                        throw new RuntimeException("Found "+ids.length+" deadlocked threads");
+                    }
+                    pause(100);
+                } catch(InterruptedException | RuntimeException x) {
+                    if (deadlock) deadlock(x);
+                    else fail(x);
+                }
+            }
+        }
+
+    }
+
+    static final class Stopper extends Thread {
+        long start;
+        long time;
+
+        Stopper(long time) {
+            start = System.currentTimeMillis();
+            this.time = time;
+            setDaemon(true);
+        }
+
+        @Override
+        public void run() {
+            try {
+                long rest, previous;
+                int msgCount = 0;
+                previous = time;
+                Logger logger =  Logger.getLogger("remaining");
+                while (goOn && (rest = start - System.currentTimeMillis() + time) > 0) {
+                    if (previous == time || previous - rest >= STEP) {
+                        logger.log(Level.INFO, "{0}ms remaining...", String.valueOf(rest));
+                        msgCount++;
+                        previous = rest == time ? rest -1 : rest;
+                        System.gc();
+                    }
+                    if (goOn == false) break;
+                    pause(Math.min(rest, 100));
+                }
+                System.err.println(this + ": " + msgCount + " messages.");
+                System.err.flush();
+                System.out.println(System.currentTimeMillis() - start
+                        + " ms elapsed ("+time+ " requested)");
+                goOn = false;
+            } catch(InterruptedException | RuntimeException x) {
+                fail(x);
+            }
+        }
+
+    }
+
+    // ThreadInfo.toString() only prints 8 frames...
+    static String asString(ThreadInfo inf) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("\"").append(inf.getThreadName()).append("\"")
+                .append(inf.isDaemon() ? " daemon" : "")
+                .append(" prio=").append(inf.getPriority())
+                .append(" Id=").append(inf.getThreadId())
+                .append(" ").append(inf.getThreadState());
+        if (inf.getLockName() != null) {
+            sb.append(" on ").append(inf.getLockName());
+        }
+        if (inf.getLockOwnerName() != null) {
+            sb.append(" owned by \"").append(inf.getLockOwnerName())
+                    .append("\" Id=").append(inf.getLockOwnerId());
+        }
+        if (inf.isSuspended()) {
+            sb.append(" (suspended)");
+        }
+        if (inf.isInNative()) {
+            sb.append(" (in native)");
+        }
+        sb.append('\n');
+        int i = 0;
+        StackTraceElement[] stackTrace = inf.getStackTrace();
+        for (; i < stackTrace.length; i++) {
+            StackTraceElement ste = stackTrace[i];
+            sb.append("\tat ").append(ste.toString());
+            sb.append('\n');
+            if (i == 0 && inf.getLockInfo() != null) {
+                Thread.State ts = inf.getThreadState();
+                switch (ts) {
+                    case BLOCKED:
+                        sb.append("\t-  blocked on ").append(inf.getLockInfo());
+                        sb.append('\n');
+                        break;
+                    case WAITING:
+                        sb.append("\t-  waiting on ").append(inf.getLockInfo());
+                        sb.append('\n');
+                        break;
+                    case TIMED_WAITING:
+                        sb.append("\t-  waiting on ").append(inf.getLockInfo());
+                        sb.append('\n');
+                        break;
+                    default:
+                }
+            }
+
+            for (MonitorInfo mi : inf.getLockedMonitors()) {
+                if (mi.getLockedStackDepth() == i) {
+                    sb.append("\t-  locked ").append(mi);
+                    sb.append('\n');
+                }
+            }
+        }
+        if (i < stackTrace.length) {
+           sb.append("\t...");
+           sb.append('\n');
+        }
+
+        LockInfo[] locks = inf.getLockedSynchronizers();
+        if (locks.length > 0) {
+           sb.append("\n\tNumber of locked synchronizers = ").append(locks.length);
+           sb.append('\n');
+           for (LockInfo li : locks) {
+               sb.append("\t- ").append(li);
+               sb.append('\n');
+           }
+        }
+        sb.append('\n');
+        return sb.toString();
+    }
+
+    static void pause(long millis) throws InterruptedException {
+        Thread.sleep(millis);
+    }
+
+    static void fail(Exception x) {
+        x.printStackTrace(System.err);
+        if (thrown == null) {
+            thrown = x;
+        }
+        goOn = false;
+    }
+
+    static void deadlock(Exception x) {
+        deadlock = true;
+        System.out.flush();
+        fail(x);
+        System.err.flush();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/LogManager/Configuration/TestConfigurationLock.properties	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,22 @@
+########################################################################
+#  Logging configuration property file for TestConfigurationLock.java  #
+########################################################################
+
+handlers= java.util.logging.ConsoleHandler
+
+.level= INFO
+
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+java.util.logging.ConsoleHandler.level = INFO
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+blah.level = FINE
+foo.bar.l10.level = INFO
+foo.bar.l100.level = INFO
+foo.bar.l1000.level = INFO
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/crypto/SecretKeyFactory/PBKDF2TranslateTest.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Random;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.interfaces.PBEKey;
+import javax.crypto.spec.PBEKeySpec;
+import javax.security.auth.DestroyFailedException;
+
+import static java.lang.System.out;
+
+/*
+ * @test
+ * @bug 8048820
+ * @summary The test verifies if the SecretKeyFactory.translateKey() method
+ *  works as expected for the PBKDF2 algorithms.
+ */
+
+public class PBKDF2TranslateTest {
+
+    private static final String PASS_PHRASE = "some hidden string";
+    private static final int ITERATION_COUNT = 1000;
+    private static final int KEY_SIZE = 128;
+    private static final String[] TEST_ALGOS = { "PBKDF2WithHmacSHA1",
+            "PBKDF2WithHmacSHA224", "PBKDF2WithHmacSHA256",
+            "PBKDF2WithHmacSHA384", "PBKDF2WithHmacSHA512" };
+    private final String algoForTest;
+
+    public static void main(String[] args) throws Exception {
+        for (String algo : TEST_ALGOS) {
+            PBKDF2TranslateTest theTest = new PBKDF2TranslateTest(algo);
+            byte[] salt = new byte[8];
+            new Random().nextBytes(salt);
+            theTest.testMyOwnSecretKey(salt);
+            theTest.generateAndTranslateKey(salt);
+            theTest.translateSpoiledKey(salt);
+        }
+    }
+
+    public PBKDF2TranslateTest(String algo) {
+        algoForTest = algo;
+    }
+
+    /**
+     * The test case scenario implemented in the method: - derive PBKDF2 key
+     * using the given algorithm; - translate the key - check if the translated
+     * and original keys have the same key value.
+     *
+     */
+    public void generateAndTranslateKey(byte[] salt)
+            throws NoSuchAlgorithmException, InvalidKeySpecException,
+            InvalidKeyException {
+        // derive PBKDF2 key
+        SecretKey key1 = getSecretKeyForPBKDF2(algoForTest, salt);
+
+        // translate key
+        SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+        SecretKey key2 = skf.translateKey(key1);
+
+        // Check if it still the same after translation
+        if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {
+            System.out.println("Key1=" + new String(key1.getEncoded())
+                    + " key2=" + new String(key2.getEncoded()) + " salt="
+                    + new String(salt));
+            throw new RuntimeException(
+                    "generateAndTranslateKey test case failed: the  key1 and"
+                            + " key2 values in its primary encoding format are"
+                            + " not the same for " + algoForTest
+                            + " algorithm.");
+        }
+    }
+
+    /**
+     * The test case scenario implemented in the method: - derive Key1 for the
+     * given PBKDF2 algorithm - create my own secret Key2 as an instance of a
+     * class implements PBEKey - translate Key2 - check if the key value of the
+     * translated key and Key1 are the same.
+     */
+    private void testMyOwnSecretKey(byte[] salt)
+            throws NoSuchAlgorithmException, InvalidKeySpecException,
+            InvalidKeyException {
+        SecretKey key1 = getSecretKeyForPBKDF2(algoForTest, salt);
+        SecretKey key2 = getMyOwnSecretKey(salt);
+
+        // Is it actually the same?
+        if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {
+            throw new RuntimeException(
+                    "We shouldn't be here. The key1 and key2 values in its"
+                            + " primary encoding format have to be the same!");
+        }
+
+        // translate key
+        SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+        SecretKey key3 = skf.translateKey(key2);
+
+        // Check if it still the same after translation
+        if (!Arrays.equals(key1.getEncoded(), key3.getEncoded())) {
+            System.out.println("Key1=" + new String(key1.getEncoded())
+                    + " key3=" + new String(key3.getEncoded()) + " salt="
+                    + new String(salt));
+            throw new RuntimeException(
+                    "testMyOwnSecretKey test case failed: the key1  and key3"
+                            + " values in its primary encoding format are not"
+                            + " the same for " + algoForTest + " algorithm.");
+        }
+
+    }
+
+    /**
+     * The test case scenario implemented in the method: - create my own secret
+     * Key2 as an instance of a class implements PBEKey - spoil the key (set
+     * iteration count to 0, for example) - try to translate key -
+     * InvalidKeyException is expected.
+     */
+    public void translateSpoiledKey(byte[] salt)
+            throws NoSuchAlgorithmException, InvalidKeySpecException {
+        // derive the key
+        SecretKey key1 = getMyOwnSecretKey(salt);
+
+        // spoil the key
+        ((MyPBKDF2SecretKey) key1).spoil();
+
+        // translate key
+        SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+        try {
+            skf.translateKey(key1);
+            throw new RuntimeException(
+                    "translateSpoiledKey test case failed, should throw"
+                            + " InvalidKeyException when spoil the key");
+        } catch (InvalidKeyException ike) {
+            out.println("Expected exception when spoil the key");
+        }
+
+    }
+
+    /**
+     * Generate a PBKDF2 secret key using given algorithm.
+     */
+    private SecretKey getSecretKeyForPBKDF2(String algoDeriveKey, byte[] salt)
+            throws NoSuchAlgorithmException, InvalidKeySpecException {
+
+        SecretKeyFactory skf = SecretKeyFactory.getInstance(algoDeriveKey);
+        PBEKeySpec spec = new PBEKeySpec(PASS_PHRASE.toCharArray(), salt,
+                ITERATION_COUNT, KEY_SIZE);
+
+        return skf.generateSecret(spec);
+    }
+
+    /**
+     * Generate a secrete key as an instance of a class implements PBEKey.
+     */
+    private SecretKey getMyOwnSecretKey(byte[] salt)
+            throws InvalidKeySpecException, NoSuchAlgorithmException {
+        return new MyPBKDF2SecretKey(PASS_PHRASE, algoForTest, salt,
+                ITERATION_COUNT, KEY_SIZE);
+    }
+
+    /**
+     * An utility class to check the SecretKeyFactory.translateKey() method.
+     */
+    class MyPBKDF2SecretKey implements PBEKey {
+        private final byte[] key;
+        private final byte[] salt;
+        private final String algorithm;
+        private final int keyLength;
+        private final String pass;
+        private int itereationCount;
+
+        /**
+         * The key is generating by SecretKeyFactory and its value just copying
+         * in the key field of MySecretKey class. So, this is real key derived
+         * using the given algo.
+         */
+        public MyPBKDF2SecretKey(String passPhrase, String algo, byte[] salt1,
+                int iterationCount, int keySize)
+                throws InvalidKeySpecException, NoSuchAlgorithmException {
+            algorithm = algo;
+            salt = salt1;
+            itereationCount = iterationCount;
+            pass = passPhrase;
+
+            PBEKeySpec spec = new PBEKeySpec(passPhrase.toCharArray(), salt,
+                    iterationCount, keySize);
+
+            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algo);
+
+            SecretKey realKey = keyFactory.generateSecret(spec);
+
+            keyLength = realKey.getEncoded().length;
+
+            key = new byte[keyLength];
+            System.arraycopy(realKey.getEncoded(), 0, key, 0, keyLength);
+        }
+
+        @Override
+        public String getAlgorithm() {
+            return algorithm;
+        }
+
+        @Override
+        public String getFormat() {
+            return "RAW";
+        }
+
+        @Override
+        public byte[] getEncoded() {
+            byte[] copy = new byte[keyLength];
+            System.arraycopy(key, 0, copy, 0, keyLength);
+            return copy;
+        }
+
+        @Override
+        public int getIterationCount() {
+            return itereationCount;
+        }
+
+        @Override
+        public byte[] getSalt() {
+            return salt;
+        }
+
+        @Override
+        public char[] getPassword() {
+            return pass.toCharArray();
+        }
+
+        /**
+         * Spoil the generated key (before translation) to cause an
+         * InvalidKeyException
+         */
+        public void spoil() {
+            itereationCount = -1;
+        }
+
+        @Override
+        public void destroy() throws DestroyFailedException {
+        }
+
+        @Override
+        public boolean isDestroyed() {
+            return false;
+        }
+
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/crypto/SecretKeyFactory/SecKFTranslateTest.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.ShortBufferException;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import javax.security.auth.DestroyFailedException;
+
+/*
+ * @test
+ * @bug 8048820
+ * @summary The test verifies SecretKey values should remain the same after
+ *  translation with SecretKeyFactory.translateKey().
+ */
+
+public class SecKFTranslateTest {
+    private static final String SUN_JCE = "SunJCE";
+
+    public static void main(String[] args) throws Exception {
+
+        SecKFTranslateTest test = new SecKFTranslateTest();
+        test.run();
+    }
+
+    private void run() throws Exception {
+
+        for (Algorithm algorithm : Algorithm.values()) {
+            runTest(algorithm);
+        }
+    }
+
+    private void runTest(Algorithm algo) throws NoSuchAlgorithmException,
+            NoSuchProviderException, InvalidKeyException,
+            InvalidKeySpecException, NoSuchPaddingException,
+            InvalidAlgorithmParameterException, ShortBufferException,
+            IllegalBlockSizeException, BadPaddingException {
+        AlgorithmParameterSpec[] aps = new AlgorithmParameterSpec[1];
+        byte[] plainText = new byte[800];
+
+        SecretKey key1 = algo.intSecurityKey(aps);
+        Random random = new Random();
+        // Initialization
+        SecretKeyFactory skf = SecretKeyFactory.getInstance(algo.toString(),
+                SUN_JCE);
+
+        random.nextBytes(plainText);
+        Cipher ci = Cipher.getInstance(algo.toString(), SUN_JCE);
+        // Encryption
+        ci.init(Cipher.ENCRYPT_MODE, key1, aps[0]);
+        byte[] cipherText = new byte[ci.getOutputSize(plainText.length)];
+        int offset = ci.update(plainText, 0, plainText.length, cipherText, 0);
+        ci.doFinal(cipherText, offset);
+        // translate key
+        SecretKey key2 = skf.translateKey(key1);
+
+        // Decryption
+        ci.init(Cipher.DECRYPT_MODE, key2, aps[0]);
+        byte[] recoveredText = new byte[ci.getOutputSize(plainText.length)];
+        ci.doFinal(cipherText, 0, cipherText.length, recoveredText);
+
+        // Comparison
+        if (!Arrays.equals(plainText, recoveredText)) {
+            System.out.println("Key1:" + new String(key1.getEncoded())
+                    + " Key2:" + new String(key2.getEncoded()));
+            throw new RuntimeException("Testing translate key failed with "
+                    + algo);
+        }
+
+    }
+}
+
+class MyOwnSecKey implements SecretKey {
+
+    private static final String DEFAULT_ALGO = "PBEWithMD5AndDES";
+    private final byte[] key;
+    private final String algorithm;
+    private final int keySize;
+
+    public MyOwnSecKey(byte[] key1, int offset, String algo)
+            throws InvalidKeyException {
+        algorithm = algo;
+        if (algo.equalsIgnoreCase("DES")) {
+            keySize = 8;
+        } else if (algo.equalsIgnoreCase("DESede")) {
+            keySize = 24;
+        } else {
+            throw new InvalidKeyException(
+                    "Inappropriate key format and algorithm");
+        }
+
+        if (key1 == null || key1.length - offset < keySize) {
+            throw new InvalidKeyException("Wrong key size");
+        }
+        key = new byte[keySize];
+        System.arraycopy(key, offset, key, 0, keySize);
+    }
+
+    public MyOwnSecKey(PBEKeySpec ks) throws InvalidKeySpecException {
+        algorithm = DEFAULT_ALGO;
+        key = new String(ks.getPassword()).getBytes();
+        keySize = key.length;
+    }
+
+    @Override
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    @Override
+    public String getFormat() {
+        return "RAW";
+    }
+
+    @Override
+    public byte[] getEncoded() {
+        byte[] copy = new byte[keySize];
+        System.arraycopy(key, 0, copy, 0, keySize);
+        return copy;
+    }
+
+    @Override
+    public void destroy() throws DestroyFailedException {
+    }
+
+    @Override
+    public boolean isDestroyed() {
+        return false;
+    }
+}
+
+enum Algorithm {
+    DES {
+        @Override
+        SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+                throws InvalidKeyException {
+            int keyLength = 8;
+            byte[] keyVal = new byte[keyLength];
+            new SecureRandom().nextBytes(keyVal);
+            SecretKey key1 = new MyOwnSecKey(keyVal, 0, this.toString());
+            return key1;
+        }
+    },
+    DESEDE {
+        @Override
+        SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+                throws InvalidKeyException {
+            int keyLength = 24;
+            byte[] keyVal = new byte[keyLength];
+            new SecureRandom().nextBytes(keyVal);
+            SecretKey key1 = new MyOwnSecKey(keyVal, 0, this.toString());
+            return key1;
+        }
+    },
+    PBEWithMD5ANDdes {
+        @Override
+        SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+                throws InvalidKeySpecException {
+            byte[] salt = new byte[8];
+            int iterCnt = 6;
+            new Random().nextBytes(salt);
+            spec[0] = new PBEParameterSpec(salt, iterCnt);
+            PBEKeySpec pbeKS = new PBEKeySpec(
+                    new String("So far so good").toCharArray());
+            SecretKey key1 = new MyOwnSecKey(pbeKS);
+            return key1;
+        }
+    };
+    abstract SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+            throws InvalidKeyException, InvalidKeySpecException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/script/SimpleScriptContextNameChecksTest.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8072853
+ * @summary SimpleScriptContext used by NashornScriptEngine doesn't completely complies to the spec regarding exception throwing
+ * @run testng SimpleScriptContextNameChecksTest
+ */
+
+import java.util.List;
+import java.util.function.Consumer;
+import javax.script.*;
+import org.testng.annotations.Test;
+
+public class SimpleScriptContextNameChecksTest {
+    private List<ScriptEngineFactory> getFactories() {
+        return new ScriptEngineManager().getEngineFactories();
+    }
+
+    private void testAndExpect(Consumer<ScriptContext> c, Class<? extends RuntimeException> clazz) {
+        for (ScriptEngineFactory fac : getFactories()) {
+            ScriptContext sc = fac.getScriptEngine().getContext();
+            String name = fac.getEngineName();
+            try {
+                c.accept(sc);
+                throw new RuntimeException("no exception for " + name);
+            } catch (NullPointerException | IllegalArgumentException e) {
+                if (e.getClass() == clazz) {
+                    System.out.println("got " + e + " as expected for " + name);
+                } else {
+                    throw e;
+                }
+            }
+        }
+    }
+
+    private void testAndExpectIAE(Consumer<ScriptContext> c) {
+        testAndExpect(c, IllegalArgumentException.class);
+    }
+
+    private void testAndExpectNPE(Consumer<ScriptContext> c) {
+        testAndExpect(c, NullPointerException.class);
+    }
+
+    @Test
+    public void getAttributeEmptyName() {
+        testAndExpectIAE(sc -> sc.getAttribute("", ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void getAttributeNullName() {
+        testAndExpectNPE(sc -> sc.getAttribute(null, ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void removeAttributeEmptyName() {
+        testAndExpectIAE(sc -> sc.removeAttribute("", ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void removeAttributeNullName() {
+        testAndExpectNPE(sc -> sc.removeAttribute(null, ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void setAttributeEmptyName() {
+        testAndExpectIAE(sc -> sc.setAttribute("", "value", ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void setAttributeNullName() {
+        testAndExpectNPE(sc -> sc.setAttribute(null, "value", ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void getAttributesScopeEmptyName() {
+        testAndExpectIAE(sc -> sc.getAttributesScope(""));
+    }
+
+    @Test
+    public void getAttributesScopeNullName() {
+        testAndExpectNPE(sc -> sc.getAttributesScope(null));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/ErrorHandlerPermissions.java	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  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.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import javax.xml.XMLConstants;
+import javax.xml.crypto.Data;
+import javax.xml.crypto.KeySelector;
+import javax.xml.crypto.OctetStreamData;
+import javax.xml.crypto.URIDereferencer;
+import javax.xml.crypto.URIReference;
+import javax.xml.crypto.URIReferenceException;
+import javax.xml.crypto.XMLCryptoContext;
+import javax.xml.crypto.dsig.XMLSignature;
+import javax.xml.crypto.dsig.XMLSignatureFactory;
+import javax.xml.crypto.dsig.dom.DOMValidateContext;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * @test
+ * @bug 8079140
+ * @summary Check if IgnoreAllErrorHandler doesn't require additional permission
+ * @run main/othervm/java.security.policy=ErrorHandlerPermissions.policy
+ *                                                      ErrorHandlerPermissions
+ */
+public class ErrorHandlerPermissions {
+
+    private final static String FS = System.getProperty("file.separator");
+    private final static String DIR = System.getProperty("test.src", ".");
+    private final static String DATA_DIR = DIR + FS + "data";
+    private final static String SIGNATURE = DATA_DIR + FS +
+            "signature-external-rsa.xml";
+
+    private static final String validationKey =
+        "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnx4TdvPSA5vcsPi0OJZi9Ox0Z" +
+        "2FRz2oeUCtuWoyEg0kUCeFd+jJZMstDJUiZNSOeuCO3FWSpdJgAwI4zlveHvuU/o" +
+        "qHSa1eYTObOCvxfVYGGflWsSvGXyiANtRWVUrYODBeyL+2pWxDYh+Fi5EKizPfTG" +
+        "wRjBVRSkRZKTnSjnQwIDAQAB";
+
+    private static final URIDereferencer dereferencer =
+            new DummyURIDereferencer();
+
+    public static void main(String[] args) throws Exception {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setNamespaceAware(true);
+        dbf.setValidating(false);
+        dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
+        Document doc = dbf.newDocumentBuilder().parse(new File(SIGNATURE));
+        NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,
+                "Signature");
+        if (nl.getLength() == 0) {
+            throw new RuntimeException("Couldn't find 'Signature' element");
+        }
+        Element element = (Element) nl.item(0);
+
+        byte[] keyBytes = Base64.getDecoder().decode(validationKey);
+        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory kf = KeyFactory.getInstance("RSA");
+        PublicKey key = kf.generatePublic(spec);
+        KeySelector ks = KeySelector.singletonKeySelector(key);
+
+        DOMValidateContext vc = new DOMValidateContext(ks, element);
+
+        // disable secure validation mode
+        vc.setProperty("org.jcp.xml.dsig.secureValidation", Boolean.FALSE);
+
+        // set a dummy dereferencer to be able to get content by references
+        vc.setURIDereferencer(dereferencer);
+
+        XMLSignatureFactory factory = XMLSignatureFactory.getInstance();
+        XMLSignature signature = factory.unmarshalXMLSignature(vc);
+
+        // run validation
+        signature.validate(vc);
+    }
+
+    /**
+     * This URIDereferencer returns a static XML document.
+     */
+    private static class DummyURIDereferencer implements URIDereferencer {
+
+        @Override
+        public Data dereference(final URIReference ref, XMLCryptoContext ctx)
+                throws URIReferenceException {
+            // return static content
+            return new OctetStreamData(new ByteArrayInputStream(
+                    "<test>test</test>".getBytes()), ref.getURI(),
+                    ref.getType());
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/ErrorHandlerPermissions.policy	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,5 @@
+grant {
+    permission java.util.PropertyPermission "test.src", "read";
+    permission java.util.PropertyPermission "file.separator", "read";
+    permission java.io.FilePermission "${test.src}/-", "read";
+};
--- a/jdk/test/javax/xml/crypto/dsig/ValidationTests.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/javax/xml/crypto/dsig/ValidationTests.java	Tue May 19 11:40:00 2015 -0700
@@ -35,6 +35,7 @@
 import java.security.*;
 import javax.xml.crypto.Data;
 import javax.xml.crypto.KeySelector;
+import javax.xml.crypto.MarshalException;
 import javax.xml.crypto.OctetStreamData;
 import javax.xml.crypto.URIDereferencer;
 import javax.xml.crypto.URIReference;
@@ -60,9 +61,17 @@
     static class Test {
         String file;
         KeySelector ks;
-        Test(String file, KeySelector ks) {
+        Class exception;
+
+        Test(String file, KeySelector ks, Class exception) {
             this.file = file;
             this.ks = ks;
+            this.exception = exception;
+        }
+
+        // XMLSignatureException is expected by default
+        Test(String file, KeySelector ks) {
+            this(file, ks, XMLSignatureException.class);
         }
     }
 
@@ -110,7 +119,17 @@
     private final static Test[] INVALID_TESTS = {
         new Test("signature-enveloping-hmac-sha1-40.xml", SKKS),
         new Test("signature-enveloping-hmac-sha1-trunclen-0-attack.xml", SKKS),
-        new Test("signature-enveloping-hmac-sha1-trunclen-8-attack.xml", SKKS)
+        new Test("signature-enveloping-hmac-sha1-trunclen-8-attack.xml", SKKS),
+        new Test("signature-extra-text-in-signed-info.xml", SKKS,
+                MarshalException.class),
+        new Test("signature-wrong-canonicalization-method-algorithm.xml", SKKS,
+                MarshalException.class),
+        new Test("signature-wrong-transform-algorithm.xml", SKKS,
+                MarshalException.class),
+        new Test("signature-no-reference-uri.xml", SKKS),
+        new Test("signature-wrong-signature-method-algorithm.xml", SKKS,
+                MarshalException.class),
+        new Test("signature-wrong-tag-names.xml", SKKS, MarshalException.class)
     };
 
     public static void main(String args[]) throws Exception {
@@ -143,9 +162,14 @@
                 test_signature(test);
                 System.out.println("FAILED");
                 atLeastOneFailed = true;
-            } catch (XMLSignatureException xse) {
-                System.out.println(xse.getMessage());
-                System.out.println("PASSED");
+            } catch (Exception e) {
+                System.out.println("Exception: " + e);
+                if (e.getClass() != test.exception) {
+                    System.out.println("FAILED: unexpected exception");
+                    atLeastOneFailed = true;
+                } else {
+                    System.out.println("PASSED");
+                }
             }
         }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-external-rsa.xml	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI="http://oracle.com"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>f6trDCcPsLLkIV/V4DGFbRf8b9Jwal8xGBDshNzEXwPmym2ChN85rbKIg/cbunf04F89/SXLo2v9
+AYjLcUr3G/Vz5YUmqNhnBvJukXgsIG0ddWl3mFi9Tk+CLINlbgfsaFqU9pQwFjmDyAqIrvZYqW7p
+rTHLetv218mbUVBBAkc=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-extra-text-in-signed-info.xml	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue><test>extra text</test></Reference></SignedInfo><SignatureValue>iTrgJERmYeD5hFwY8/MwJpkF+nd++AAOgf/Kxt9SwdE6BIYq2Vyxq4CQPhD+t2971BGTgvF6ejZd
++/Ko4Zs5Dqf4Lt65Vck0q43rM0PdP1e8gJov0IPYnZ1zeqFpah+N/OjmqTbshaZWRIjf3eqS6en5
+ZKjn+TkCQ1kOX/YUNDc=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-no-reference-uri.xml	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>BNPSYlNcyXcO/Tc1tr9mQ/KAZ40eFybLTDyB/HH1EHHMpc972A+nOX2EWBaLsVgG8apl0Isp1ZqV
+gmoDHNF6xrcJJQVydVJzU08GVV4GiXHMqRYQbted7STQLhlhssvNNdMEoVApsX5ByL66wxKZQXrT
+z1kZtOHAi88DOrmIJu0=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-canonicalization-method-algorithm.xml	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://oracle.com"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>EBbyEV7e+1CTUsyCTyxiN8p+U3/za1oTjK7q+kF8Q87r8e/7C1z4ndGWbk6zyI3w6leT+I2suW9U
+KkdvkrDXX2OyLw0GfgJfLkNn+1pGK6kyWpL95NoWJZhHkUAKKBZ0ikfZ4j33gYxrYK+IYCLeZYzr
+hlZjdXXXCiSH0Sq+weQ=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-signature-method-algorithm.xml	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="bogus://bogus"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>RjL9nfQg9u6+KEFfAlBBH7E7ilFgB7YEQ5MxOIJN/fOdQmc5iDD+YuhiHzNGXGi/UOyo6t8LxTxl
+X4oFE1RNlPVkSAZK4LcTWhVa757WwgW1/EZo8PQYWp5NScLq6PumYaujoovSYBKW2N6+jQpnD/L6
+4cuEVNnwEFqvOLrjogY=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-tag-names.xml	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><aSignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><aCanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></aCanonicalizationMethod><aSignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></aSignatureMethod><aReference URI=""><Transforms><aTransform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></aTransform></Transforms><aDigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></aDigestMethod><aDigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</aDigestValue></aReference></aSignedInfo><aSignatureValue>cbNpPGavhM0BGUtrvLxvy2SCIt+I27BPpVEt0Q9mXrdPYurMqWF/67AdY9m5RqS7+ZZlwUtem083
+MczRYbKoOIq7sMbCqKKdzbSE/U6rfmky/ACQ5wgemZl8jtipwu5LhAUzjhzT8hhTjVqOYpHdkVJz
+l9dnd9eWbLmEr3BI0VA=</aSignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-transform-algorithm.xml	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,4 @@
+<!-- This XML signature contains a Transform with wrong algorithm -->
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="bogus://bogus"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>Wzyx3jgEKGwY+pBXBmqWLWhASHQYCCGZVii5sKKKeZUBKxNBthjiSVfzKANuLgX6zAt16XRycrSL
+zFKTPuvGeWVPDvd+KTNKCJxN9ccrG7v23EM7RY2eMJGu2r5DLfKwV7H6YuJPsOuWifVkKAhvq7gd
+6akJshxyAj9Ud+mjo48=</SignatureValue></Signature></test>
\ No newline at end of file
--- a/jdk/test/sun/nio/cs/FindDecoderBugs.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/sun/nio/cs/FindDecoderBugs.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,16 +24,19 @@
 /*
  * @test
  * @bug 6380723
- * @summary Decode many byte sequences in many ways
+ * @summary Decode many byte sequences in many ways (use -Dseed=X to set PRNG seed)
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
  * @run main/timeout=1800 FindDecoderBugs
  * @author Martin Buchholz
- * @key randomness
+ * @key intermittent randomness
  */
 
 import java.util.*;
 import java.util.regex.*;
 import java.nio.*;
 import java.nio.charset.*;
+import jdk.testlibrary.RandomFactory;
 
 public class FindDecoderBugs {
 
@@ -322,7 +325,7 @@
         }
     }
 
-    private final static Random rnd = new Random();
+    private final static Random rnd = RandomFactory.getRandom();
     private static byte randomByte() {
         return (byte) rnd.nextInt(0x100);
     }
--- a/jdk/test/sun/security/krb5/config/ConfPlusProp.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/ConfPlusProp.java	Tue May 19 11:40:00 2015 -0700
@@ -35,6 +35,12 @@
 public class ConfPlusProp {
     Config config;
     public static void main(String[] args) throws Exception {
+        if (System.getenv("USERDNSDOMAIN") != null ||
+                System.getenv("LOGONSERVER") != null) {
+            System.out.println(
+                    "Looks like a Windows machine in a domain. Skip test.");
+            return;
+        }
         new ConfPlusProp().run();
     }
 
@@ -90,23 +96,8 @@
         check("R2", "old");
         check("R3", null);
 
-        int version = System.getProperty("java.version").charAt(2) - '0';
-        System.out.println("JDK version is " + version);
-
-        // Zero-config is supported since 1.7
-        if (version >= 7) {
-            // Point to a non-existing file
-            System.setProperty("java.security.krb5.conf", "i-am-not-a file");
-            refresh();
-
-            // Default realm might come from DNS
-            //checkDefaultRealm(null);
-            check("R1", null);
-            check("R2", null);
-            check("R3", null);
-            if (config.get("libdefaults", "forwardable") != null) {
-                throw new Exception("Extra config error");
-            }
+        if (config.get("libdefaults", "forwardable") != null) {
+            throw new Exception("Extra config error");
         }
 
         // Add prop
@@ -136,14 +127,6 @@
         check("R2", "k2");
         check("R3", "k2");
 
-        // Point to a non-existing file
-        System.setProperty("java.security.krb5.conf", "i-am-not-a file");
-        refresh();
-
-        checkDefaultRealm("R2");
-        check("R1", "k2");
-        check("R2", "k2");
-        check("R3", "k2");
         if (config.get("libdefaults", "forwardable") != null) {
             throw new Exception("Extra config error");
         }
--- a/jdk/test/sun/security/krb5/config/DNS.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/DNS.java	Tue May 19 11:40:00 2015 -0700
@@ -23,12 +23,22 @@
 
 // See dns.sh.
 import sun.security.krb5.Config;
+import sun.security.krb5.KrbException;
 
 public class DNS {
     public static void main(String[] args) throws Exception {
         System.setProperty("java.security.krb5.conf",
-                System.getProperty("test.src", ".") +"/nothing.conf");
+                System.getProperty("test.src", ".") +"/no-such-file.conf");
         Config config = Config.getInstance();
+        try {
+            String r = config.getDefaultRealm();
+            throw new Exception("What? There is a default realm " + r + "?");
+        } catch (KrbException ke) {
+            ke.printStackTrace();
+            if (ke.getCause() != null) {
+                throw new Exception("There should be no cause. Won't try DNS");
+            }
+        }
         String kdcs = config.getKDCList("X");
         if (!kdcs.equals("a.com.:88 b.com.:99") &&
                 !kdcs.equals("a.com. b.com.:99")) {
--- a/jdk/test/sun/security/krb5/config/DnsFallback.java	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/DnsFallback.java	Tue May 19 11:40:00 2015 -0700
@@ -22,8 +22,7 @@
  */
 /*
  * @test
- * @bug 6673164
- * @bug 6552334
+ * @bug 6673164 6552334 8077102
  * @run main/othervm DnsFallback
  * @summary fix dns_fallback parse error, and use dns by default
  */
@@ -35,47 +34,66 @@
 public class DnsFallback {
 
     static Method useDNS_Realm;
+    static Method useDNS_KDC;
 
     public static void main(String[] args) throws Exception {
 
         useDNS_Realm = Config.class.getDeclaredMethod("useDNS_Realm");
         useDNS_Realm.setAccessible(true);
+        useDNS_KDC = Config.class.getDeclaredMethod("useDNS_KDC");
+        useDNS_KDC.setAccessible(true);
 
 
         // for 6673164
-        check("true", "true", true);
-        check("false", "true", false);
-        check("true", "false", true);
-        check("false", "false", false);
-        check("true", null, true);
-        check("false", null, false);
-        check(null, "true", true);
-        check(null, "false", false);
+        check("true", "true", true, true);
+        check("false", "true", false, false);
+        check("true", "false", true, true);
+        check("false", "false", false, false);
+        check("true", null, true, true);
+        check("false", null, false, false);
+        check(null, "true", true, true);
+        check(null, "false", false, false);
 
-        // for 6552334
-        check(null, null, true);
+        // for 6552334, no longer true
+        //check(null, null, true, true);
+
+        // 8077102
+        check(null, null, false, true);
     }
 
-    static void check(String realm, String fallback, boolean output)
+    /**
+     * Sets and checks.
+     *
+     * @param u dns_lookup_XXX value set, none if null
+     * @param f dns_fallback value set, none if null
+     * @param r expected useDNS_Realm
+     * @param k expected useDNS_KDC
+     */
+    static void check(String u, String f, boolean r, boolean k)
             throws Exception {
 
         try (PrintStream ps =
                 new PrintStream(new FileOutputStream("dnsfallback.conf"))) {
             ps.println("[libdefaults]\n");
-            if (realm != null) {
-                ps.println("dns_lookup_realm=" + realm);
+            if (u != null) {
+                ps.println("dns_lookup_realm=" + u);
+                ps.println("dns_lookup_kdc=" + u);
             }
-            if (fallback != null) {
-                ps.println("dns_fallback=" + fallback);
+            if (f != null) {
+                ps.println("dns_fallback=" + f);
             }
         }
 
         System.setProperty("java.security.krb5.conf", "dnsfallback.conf");
         Config.refresh();
-        System.out.println("Testing " + realm + ", " + fallback + ", " + output);
+        System.out.println("Testing " + u + ", " + f + ", " + r + ", " + k);
 
-        if (!useDNS_Realm.invoke(Config.getInstance()).equals(output)) {
-            throw new Exception("Fail");
+        if (!useDNS_Realm.invoke(Config.getInstance()).equals(r)) {
+            throw new Exception("useDNS_Realm Fail");
+        }
+
+        if (!useDNS_KDC.invoke(Config.getInstance()).equals(k)) {
+            throw new Exception("useDNS_KDC Fail");
         }
     }
 }
--- a/jdk/test/sun/security/krb5/config/confplusprop.conf	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/confplusprop.conf	Tue May 19 11:40:00 2015 -0700
@@ -1,7 +1,7 @@
 [libdefaults]
 default_realm = R1
 forwardable = well
-dns_lookup_realm = false
+dns_lookup_kdc = false
 
 [realms]
 R1 = {
--- a/jdk/test/sun/security/krb5/config/confplusprop2.conf	Thu May 14 12:05:33 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/confplusprop2.conf	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 [libdefaults]
-dns_lookup_realm = false
+dns_lookup_kdc = false
 
 [realms]
 R1 = {
--- a/langtools/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/langtools/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -306,3 +306,4 @@
 0eb91327db5a840779cc5c35b9b858d6ef7959d1 jdk9-b61
 40058141a4ec04a3d4cacdb693ad188a5ddf48ed jdk9-b62
 a28b7f42dae9bd59513beaa5a2d6eb563dc09e08 jdk9-b63
+809d66512998789b620d08c335d7c31211a0cf29 jdk9-b64
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java	Thu May 14 12:05:33 2015 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java	Tue May 19 11:40:00 2015 -0700
@@ -119,7 +119,7 @@
             Content captionSpan;
             Content span;
             if (type.isDefaultTab()) {
-                captionSpan = HtmlTree.SPAN(new StringContent(type.text()));
+                captionSpan = HtmlTree.SPAN(configuration.getResource(type.resourceKey()));
                 span = HtmlTree.SPAN(type.tabId(),
                         HtmlStyle.activeTableTab, captionSpan);
             } else {
@@ -142,7 +142,7 @@
      */
     public Content getMethodTypeLinks(MethodTypes methodType) {
         String jsShow = "javascript:show(" + methodType.value() +");";
-        HtmlTree link = HtmlTree.A(jsShow, new StringContent(methodType.text()));
+        HtmlTree link = HtmlTree.A(jsShow, configuration.getResource(methodType.resourceKey()));
         return link;
     }
 
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java	Thu May 14 12:05:33 2015 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java	Tue May 19 11:40:00 2015 -0700
@@ -465,10 +465,10 @@
         for (Map.Entry<String,Integer> entry : typeMap.entrySet()) {
             vars.append(sep);
             sep = ",";
-            vars.append("\"");
-            vars.append(entry.getKey());
-            vars.append("\":");
-            vars.append(entry.getValue());
+            vars.append("\"")
+                    .append(entry.getKey())
+                    .append("\":")
+                    .append(entry.getValue());
         }
         vars.append("};").append(DocletConstants.NL);
         sep = "";
@@ -476,11 +476,19 @@
         for (MethodTypes entry : methodTypes) {
             vars.append(sep);
             sep = ",";
-            vars.append(entry.value()).append(":");
-            vars.append("[").append("\"").append(entry.tabId());
-            vars.append("\"").append(sep).append("\"").append(entry.text()).append("\"]");
+            vars.append(entry.value())
+                    .append(":")
+                    .append("[")
+                    .append("\"")
+                    .append(entry.tabId())
+                    .append("\"")
+                    .append(sep)
+                    .append("\"")
+                    .append(configuration.getText(entry.resourceKey()))
+                    .append("\"]");
         }
-        vars.append("};").append(DocletConstants.NL);
+        vars.append("};")
+                .append(DocletConstants.NL);
         addStyles(HtmlStyle.altColor, vars);
         addStyles(HtmlStyle.rowColor, vars);
         addStyles(HtmlStyle.tableTab, vars);
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties	Thu May 14 12:05:33 2015 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties	Tue May 19 11:40:00 2015 -0700
@@ -150,6 +150,13 @@
 doclet.Constructors=Constructors
 doclet.methods=methods
 doclet.Methods=Methods
+doclet.All_Methods=All Methods
+doclet.Static_Methods=Static Methods
+doclet.Instance_Methods=Instance Methods
+doclet.Abstract_Methods=Abstract Methods
+doclet.Concrete_Methods=Concrete Methods
+doclet.Default_Methods=Default Methods
+doclet.Deprecated_Methods=Deprecated Methods
 doclet.annotation_type_optional_members=optional elements
 doclet.Annotation_Type_Optional_Members=Optional Elements
 doclet.annotation_type_required_members=required elements
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodTypes.java	Thu May 14 12:05:33 2015 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodTypes.java	Tue May 19 11:40:00 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,22 +31,22 @@
  * @author Bhavesh Patel
  */
 public enum MethodTypes {
-    ALL(0xffff, "All Methods", "t0", true),
-    STATIC(0x1, "Static Methods", "t1", false),
-    INSTANCE(0x2, "Instance Methods", "t2", false),
-    ABSTRACT(0x4, "Abstract Methods", "t3", false),
-    CONCRETE(0x8, "Concrete Methods", "t4", false),
-    DEFAULT(0x10, "Default Methods", "t5", false),
-    DEPRECATED(0x20, "Deprecated Methods", "t6", false);
+    ALL(0xffff, "doclet.All_Methods", "t0", true),
+    STATIC(0x1, "doclet.Static_Methods", "t1", false),
+    INSTANCE(0x2, "doclet.Instance_Methods", "t2", false),
+    ABSTRACT(0x4, "doclet.Abstract_Methods", "t3", false),
+    CONCRETE(0x8, "doclet.Concrete_Methods", "t4", false),
+    DEFAULT(0x10, "doclet.Default_Methods", "t5", false),
+    DEPRECATED(0x20, "doclet.Deprecated_Methods", "t6", false);
 
     private final int value;
-    private final String text;
+    private final String resourceKey;
     private final String tabId;
     private final boolean isDefaultTab;
 
-    MethodTypes(int v, String t, String id, boolean dt) {
+    MethodTypes(int v, String k, String id, boolean dt) {
         this.value = v;
-        this.text = t;
+        this.resourceKey = k;
         this.tabId = id;
         this.isDefaultTab = dt;
     }
@@ -55,8 +55,8 @@
         return value;
     }
 
-    public String text() {
-        return text;
+    public String resourceKey() {
+        return resourceKey;
     }
 
     public String tabId() {
--- a/make/CompileJavaModules.gmk	Thu May 14 12:05:33 2015 -0700
+++ b/make/CompileJavaModules.gmk	Tue May 19 11:40:00 2015 -0700
@@ -89,7 +89,7 @@
 
 ################################################################################
 
-java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-missing,-reference '-Xdoclint/package:java.*,javax.*'
+java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-reference '-Xdoclint/package:java.*,javax.*'
 java.desktop_COPY := .gif .png .wav .txt .xml .css .pf
 java.desktop_CLEAN := iio-plugin.properties cursors.properties
 
@@ -152,7 +152,6 @@
       $(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/java2d/*.java) \
       $(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/java2d/opengl/*.java) \
       $(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/awt/*.java) \
-      $(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/awt/motif/*.java) \
       $(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/font/*.java) \
       #
 else
--- a/make/Init.gmk	Thu May 14 12:05:33 2015 -0700
+++ b/make/Init.gmk	Tue May 19 11:40:00 2015 -0700
@@ -267,7 +267,9 @@
 	    ( cd $(TOPDIR) && \
 	        $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) $(OUTPUT_SYNC_FLAG) \
 	        -j $(JOBS) -f make/Main.gmk $(USER_MAKE_VARS) \
-	        $(PARALLEL_TARGETS) )
+	        $(PARALLEL_TARGETS) || \
+	        ( exitcode=$$? && $(BUILD_LOG_WRAPPER) $(PRINTF) "\nERROR: Build failed for $(TARGET_DESCRIPTION) (exit code $$exitcode) \n" && \
+	        $(PRINTF) "Hint: If caused by a warning, try configure --disable-warnings-as-errors \n\n" && exit $$exitcode ) )
 	    $(call CleanupSmartJavac)
 	    $(call StopGlobalTimer)
 	    $(call ReportBuildTimes)
--- a/make/Javadoc.gmk	Thu May 14 12:05:33 2015 -0700
+++ b/make/Javadoc.gmk	Tue May 19 11:40:00 2015 -0700
@@ -1141,7 +1141,7 @@
 NASHORNAPI_HEADER := <strong>Nashorn API</strong>
 NASHORNAPI_BOTTOM := $(call CommonBottom,$(NASHORNAPI_FIRST_COPYRIGHT_YEAR))
 NASHORNAPI_GROUPNAME := Packages
-NASHORNAPI_REGEXP := jdk.nashorn.api.scripting.*
+NASHORNAPI_REGEXP := jdk.nashorn.api.*
 # NASHORNAPI_PKGS is located in NON_CORE_PKGS.gmk
 
 NASHORNAPI_INDEX_HTML = $(NASHORNAPI_DOCDIR)/index.html
--- a/make/common/NON_CORE_PKGS.gmk	Thu May 14 12:05:33 2015 -0700
+++ b/make/common/NON_CORE_PKGS.gmk	Tue May 19 11:40:00 2015 -0700
@@ -82,7 +82,8 @@
     com.sun.source.util \
     jdk
 
-NASHORNAPI_PKGS = jdk.nashorn.api.scripting
+NASHORNAPI_PKGS = jdk.nashorn.api.scripting \
+    jdk.nashorn.api.tree
 
 SMARTCARDIO_PKGS = javax.smartcardio
 
--- a/make/common/NativeCompilation.gmk	Thu May 14 12:05:33 2015 -0700
+++ b/make/common/NativeCompilation.gmk	Tue May 19 11:40:00 2015 -0700
@@ -487,6 +487,21 @@
     $1_EXTRA_CXXFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE)))
   endif
 
+  # Check if warnings should be considered errors.
+  # Pick first binary and toolchain specific, then binary specific, then general setting.
+  ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)),)
+    ifeq ($$($1_WARNINGS_AS_ERRORS),)
+      $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$(WARNINGS_AS_ERRORS)
+    else
+      $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$($1_WARNINGS_AS_ERRORS)
+    endif
+  endif
+
+  ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)), true)
+    $1_EXTRA_CFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS)
+    $1_EXTRA_CXXFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS)
+  endif
+
   ifeq (NONE, $$($1_OPTIMIZATION))
     $1_EXTRA_CFLAGS += $(C_O_FLAG_NONE)
     $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE)
--- a/modules.xml	Thu May 14 12:05:33 2015 -0700
+++ b/modules.xml	Tue May 19 11:40:00 2015 -0700
@@ -616,7 +616,6 @@
     <depend>java.prefs</depend>
     <depend re-exports="true">java.xml</depend>
     <depend re-exports="true">java.datatransfer</depend>
-    <depend>jdk.charsets</depend>
     <export>
       <name>java.applet</name>
     </export>
@@ -1502,10 +1501,6 @@
   <module>
     <name>jdk.charsets</name>
     <depend>java.base</depend>
-    <export>
-      <name>sun.nio.cs.ext</name>
-      <to>java.desktop</to>
-    </export>
   </module>
   <module>
     <name>jdk.compiler</name>
--- a/nashorn/.hgtags	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/.hgtags	Tue May 19 11:40:00 2015 -0700
@@ -297,3 +297,4 @@
 89937bee80bd28826de8cf60aa63a21edab63f79 jdk9-b61
 1b5604bc81a6161b1c3c9dd654cd1399474ae9ee jdk9-b62
 bc8e67bec2f92772c4a67e20e66a4f216207f0af jdk9-b63
+00df6e4fc75a83bdd958f9ef86d80e008c9ba967 jdk9-b64
--- a/nashorn/make/build.xml	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/make/build.xml	Tue May 19 11:40:00 2015 -0700
@@ -188,7 +188,7 @@
     <mkdir dir="${fxshell.classes.dir}"/>
     <javac srcdir="${fxshell.dir}"
            destdir="${fxshell.classes.dir}"
-           classpath="${dist.jar}:${javac.classpath}"
+           classpath="${dist.jar}${path.separator}${javac.classpath}"
            debug="${javac.debug}"
            encoding="${javac.encoding}"
            includeantruntime="false">
--- a/nashorn/make/project.properties	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/make/project.properties	Tue May 19 11:40:00 2015 -0700
@@ -105,8 +105,8 @@
 javac.classpath=\
     ${build.classes.dir}
 javac.test.classpath=\
-    ${build.classes.dir}:\
-    ${build.test.classes.dir}:\
+    ${build.classes.dir}${path.separator}\
+    ${build.test.classes.dir}${path.separator}\
     ${file.reference.testng.jar}
 
 meta.inf.dir=${src.dir}/META-INF
@@ -259,8 +259,8 @@
 testjfx-test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} -Xmx${run.test.xmx} -cp ${testjfx.run.test.classpath}
 
 run.test.classpath=\
-    ${file.reference.testng.jar}:\
-    ${nashorn.internal.tests.jar}:\
+    ${file.reference.testng.jar}${path.separator}\
+    ${nashorn.internal.tests.jar}${path.separator}\
     ${nashorn.api.tests.jar}
 
 src.dir=src/jdk.scripting.nashorn/share/classes
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java	Tue May 19 11:40:00 2015 -0700
@@ -1228,31 +1228,41 @@
         final List<Object> list = Arrays.asList(array);
         final Object cmpThis = cmp == null || cmp.isStrict() ? ScriptRuntime.UNDEFINED : Global.instance();
 
-        Collections.sort(list, new Comparator<Object>() {
-            private final MethodHandle call_cmp = getCALL_CMP();
-            @Override
-            public int compare(final Object x, final Object y) {
-                if (x == ScriptRuntime.UNDEFINED && y == ScriptRuntime.UNDEFINED) {
-                    return 0;
-                } else if (x == ScriptRuntime.UNDEFINED) {
-                    return 1;
-                } else if (y == ScriptRuntime.UNDEFINED) {
-                    return -1;
-                }
+        try {
+            Collections.sort(list, new Comparator<Object>() {
+                private final MethodHandle call_cmp = getCALL_CMP();
+                @Override
+                public int compare(final Object x, final Object y) {
+                    if (x == ScriptRuntime.UNDEFINED && y == ScriptRuntime.UNDEFINED) {
+                        return 0;
+                    } else if (x == ScriptRuntime.UNDEFINED) {
+                        return 1;
+                    } else if (y == ScriptRuntime.UNDEFINED) {
+                        return -1;
+                    }
 
-                if (cmp != null) {
-                    try {
-                        return (int)Math.signum((double)call_cmp.invokeExact(cmp, cmpThis, x, y));
-                    } catch (final RuntimeException | Error e) {
-                        throw e;
-                    } catch (final Throwable t) {
-                        throw new RuntimeException(t);
+                    if (cmp != null) {
+                        try {
+                            return (int)Math.signum((double)call_cmp.invokeExact(cmp, cmpThis, x, y));
+                        } catch (final RuntimeException | Error e) {
+                            throw e;
+                        } catch (final Throwable t) {
+                            throw new RuntimeException(t);
+                        }
                     }
-                }
 
-                return JSType.toString(x).compareTo(JSType.toString(y));
-            }
-        });
+                    return JSType.toString(x).compareTo(JSType.toString(y));
+                }
+            });
+        } catch (final IllegalArgumentException iae) {
+            // Collections.sort throws IllegalArgumentException when
+            // Comparison method violates its general contract
+
+            // See ECMA spec 15.4.4.11 Array.prototype.sort (comparefn).
+            // If "comparefn" is not undefined and is not a consistent
+            // comparison function for the elements of this array, the
+            // behaviour of sort is implementation-defined.
+        }
 
         return list.toArray(new Object[array.length]);
     }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArrayBuffer.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArrayBuffer.java	Tue May 19 11:40:00 2015 -0700
@@ -28,6 +28,7 @@
 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
 
 import java.nio.ByteBuffer;
+
 import jdk.nashorn.internal.objects.annotations.Attribute;
 import jdk.nashorn.internal.objects.annotations.Constructor;
 import jdk.nashorn.internal.objects.annotations.Function;
@@ -226,10 +227,10 @@
     }
 
     ByteBuffer getBuffer(final int offset) {
-        return nb.duplicate().position(offset);
+        return (ByteBuffer)nb.duplicate().position(offset);
     }
 
     ByteBuffer getBuffer(final int offset, final int length) {
-        return getBuffer(offset).limit(length);
+        return (ByteBuffer)getBuffer(offset).limit(length);
     }
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat32Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat32Array.java	Tue May 19 11:40:00 2015 -0700
@@ -81,7 +81,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Float32ArrayData.class, "setElem", void.class, int.class, double.class).methodHandle();
 
         private Float32ArrayData(final FloatBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((FloatBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat64Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat64Array.java	Tue May 19 11:40:00 2015 -0700
@@ -81,7 +81,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Float64ArrayData.class, "setElem", void.class, int.class, double.class).methodHandle();
 
         private Float64ArrayData(final DoubleBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((DoubleBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt16Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt16Array.java	Tue May 19 11:40:00 2015 -0700
@@ -82,7 +82,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Int16ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
 
         private Int16ArrayData(final ShortBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((ShortBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt32Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt32Array.java	Tue May 19 11:40:00 2015 -0700
@@ -81,7 +81,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Int32ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
 
         private Int32ArrayData(final IntBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((IntBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt8Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt8Array.java	Tue May 19 11:40:00 2015 -0700
@@ -80,7 +80,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Int8ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
 
         private Int8ArrayData(final ByteBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((ByteBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint16Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint16Array.java	Tue May 19 11:40:00 2015 -0700
@@ -81,7 +81,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Uint16ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
 
         private Uint16ArrayData(final CharBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((CharBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint32Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint32Array.java	Tue May 19 11:40:00 2015 -0700
@@ -82,7 +82,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Uint32ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
 
         private Uint32ArrayData(final IntBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((IntBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8Array.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8Array.java	Tue May 19 11:40:00 2015 -0700
@@ -81,7 +81,7 @@
         private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Uint8ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
 
         private Uint8ArrayData(final ByteBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((ByteBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java	Tue May 19 11:40:00 2015 -0700
@@ -85,7 +85,7 @@
         private static final MethodHandle CLAMP_LONG = staticCall(MethodHandles.lookup(), Uint8ClampedArrayData.class, "clampLong", long.class, long.class).methodHandle();
 
         private Uint8ClampedArrayData(final ByteBuffer nb, final int start, final int end) {
-            super(nb.position(start).limit(end).slice(), end - start);
+            super(((ByteBuffer)nb.position(start).limit(end)).slice(), end - start);
         }
 
         @Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java	Tue May 19 11:40:00 2015 -0700
@@ -1239,6 +1239,10 @@
         }
 
         if (storedScript == null) {
+            if (env._dest_dir != null) {
+                source.dump(env._dest_dir);
+            }
+
             functionNode = new Parser(env, source, errMan, strict, getLogger(Parser.class)).parse();
 
             if (errMan.hasErrors()) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java	Tue May 19 11:40:00 2015 -0700
@@ -73,7 +73,7 @@
     /** Generate line number table in class files */
     public final boolean _debug_lines;
 
-    /** Package to which generated class files are added */
+    /** Directory in which source files and generated class files are dumped */
     public final String  _dest_dir;
 
     /** Display stack trace upon error, default is false */
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java	Tue May 19 11:40:00 2015 -0700
@@ -28,9 +28,11 @@
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOError;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.PrintWriter;
 import java.io.Reader;
 import java.lang.ref.WeakReference;
 import java.net.MalformedURLException;
@@ -44,6 +46,7 @@
 import java.nio.file.Paths;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.time.LocalDateTime;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Objects;
@@ -989,4 +992,39 @@
     public DebugLogger getLogger() {
         return initLogger(Context.getContextTrusted());
     }
+
+    private File dumpFile(final String dir) {
+        final URL u = getURL();
+        final StringBuilder buf = new StringBuilder();
+        // make it unique by prefixing current date & time
+        buf.append(LocalDateTime.now().toString());
+        buf.append('_');
+        if (u != null) {
+            // make it a safe file name
+            buf.append(u.toString()
+                    .replace('/', '_')
+                    .replace('\\', '_'));
+        } else {
+            buf.append(getName());
+        }
+
+        return new File(dir, buf.toString());
+    }
+
+    void dump(final String dir) {
+        final File file = dumpFile(dir);
+        try (final FileOutputStream fos = new FileOutputStream(file)) {
+            final PrintWriter pw = new PrintWriter(fos);
+            pw.print(data.toString());
+            pw.flush();
+        } catch (final IOException ioExp) {
+            debug("Skipping source dump for " +
+                    name +
+                    ": " +
+                    ECMAErrors.getMessage(
+                        "io.error.cant.write",
+                        dir.toString() +
+                        " : " + ioExp.toString()));
+        }
+    }
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Messages.properties	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Messages.properties	Tue May 19 11:40:00 2015 -0700
@@ -121,7 +121,7 @@
 type.error.cannot.get.default.number=Cannot get default number value
 type.error.cant.apply.with.to.null=Cannot apply "with" to null
 type.error.cant.apply.with.to.undefined=Cannot apply "with" to undefined
-type.error.cant.apply.with.to.non.scriptobject=Cannot apply "with" to non script object
+type.error.cant.apply.with.to.non.scriptobject=Cannot apply "with" to non script object. Consider using "with(Object.bindProperties('{'}, nonScriptObject))".
 type.error.in.with.non.object=Right hand side of "in" cannot be non-Object, found {0}
 type.error.prototype.not.an.object="prototype" of {0} is not an Object, it is {1}
 type.error.cant.load.script=Cannot load script from {0}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Options.properties	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Options.properties	Tue May 19 11:40:00 2015 -0700
@@ -114,7 +114,7 @@
     short_name="-d",                                             \
     is_undocumented=true,                                        \
     params="<path>",                                             \
-    desc="specify a destination directory to dump class files.", \
+    desc="specify a destination directory to dump source and class files.", \
     type=String                                                  \
 }
 
--- a/nashorn/test/script/basic/8024180/with_java_object.js.EXPECTED	Thu May 14 12:05:33 2015 -0700
+++ b/nashorn/test/script/basic/8024180/with_java_object.js.EXPECTED	Tue May 19 11:40:00 2015 -0700
@@ -1,1 +1,1 @@
-TypeError: Cannot apply "with" to non script object
+TypeError: Cannot apply "with" to non script object. Consider using "with(Object.bindProperties({}, nonScriptObject))".
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8080182.js	Tue May 19 11:40:00 2015 -0700
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8080182: Array.prototype.sort throws IAE on inconsistent comparison
+ *
+ * @test
+ * @run
+ */
+
+function Random() { 
+    this.toString = function() {
+        return (Math.random() * 100).toString();
+    }
+}
+
+for (var i = 0; i < 100; ++i) {
+    var arr = []; 
+
+    for (var j = 0; j < 64; ++j) {
+        arr[j] = new Random();
+    }
+
+    // no IllegalArgumentException expected!
+    arr.sort();
+}